Я сделал веб-приложение, используя AngularJs, где пользователь может загружать файлы .txt
на сервер, используя ng-file-upload.
Теперь мне нужен простой сервер Node.js, чтобы проверить загружаемую часть и посмотреть, как ведут себя индикаторы выполнения и сообщения об ошибках на странице, но имеющие очень плохие знания о том, как Node.js и вся бэкэндовая вещь Я попытался использовать сервер Node.js, предоставленный ng-file-upload
очень wiki.
Я попытался внести некоторые изменения, которые привели меня к этому файлу app.js:
var http = require('http')
, util = require('util')
, multiparty = require('multiparty')
, PORT = process.env.PORT || 27372
var server = http.createServer(function(req, res) {
if (req.url === '/') {
res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
} else if (req.url === '/upload') {
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
if (err) {
res.writeHead(400, {'content-type': 'text/plain'});
res.end("invalid request: " + err.message);
return;
}
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received fields:\n\n '+util.inspect(fields));
res.write('\n\n');
res.end('received files:\n\n '+util.inspect(files));
});
} else {
res.writeHead(404, {'content-type': 'text/plain'});
res.end('404');
}
});
server.listen(PORT, function() {
console.info('listening on http://127.0.0.1:'+PORT+'/');
});
и UserController.js прост, как этот
UserController = function() {};
UserController.prototype.uploadFile = function(req, res) {
// We are able to access req.files.file thanks to
// the multiparty middleware
var file = req.files.file;
console.log(file.name);
console.log(file.type);
}
module.exports = new UserController();
Внутри контроллера директивы в моем приложении AngularJs я использую ng-file-upload
службу загрузки таким образом
var upload = Upload.upload({
url: 'http://127.0.0.1:27372/upload',
method: 'POST',
fields: newFields,
file: newFile
}).progress(function (evt) {
$scope.progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
}).success(function (data, status, headers, config) {
console.log("OK");
}).error(function(data, status, headers, config) {
console.log("KO");
});
Наконец, я запустил сервер следующим образом:
node app.js
и все выглядит нормально:
listening on http://127.0.0.1:27372
При всем том, когда я запускаю веб-приложение AngularJs и пытаюсь загрузить файл, я получаю следующую ошибку:
OPTIONS http://127.0.0.1:27372/upload 400 (Bad Request) angular.js:10514
XMLHttpRequest cannot load http://127.0.0.1:27372/upload. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:9000' is therefore not allowed access. The response had HTTP status code 400. (index):1
После некоторых поисковых запросов я обнаружил, что многие gists использовали для запросов CORS, таких как этот, но мои знания Node.js настолько бедны, что я даже не знаю где я должен поместить эти строки кода.
Кроме того, я попытался получить console.log(err)
внутри самой части app.js
form.parse
и получил это сообщение на терминале:
DEBUG SERVER: err =
{ [Error: missing content-type header] status: 415, statusCode: 415 }
Что мне не хватает и что я могу сделать, чтобы получить этот простой сервер Node.js работать?
EDIT 29/07/2015
Я решил следовать первому варианту, предложенному @Can Guney Aksakalli, потому что это единственный, который я могу сделать, но даже если теперь код выглядит следующим образом:
var server = http.createServer(function(req, res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
if (req.url === '/') {
res.writeHead(200, {'Content-type': 'text/html'});
// and the code stays the same
Это решение не работает; Я продолжаю получать то же сообщение об ошибке как на консоли Chrome, так и на терминале, с которого я звонил node app.js
, как я писал в последней части моего первоначального вопроса.