Неопределенный HTTP-запрос GET, интерпретированный сервером Node.js
У меня возникла проблема с приложением Node.js, когда я отправляю запрос http через клиентский вызов ajax, затем я получаю запрос на стороне сервера и пытаюсь использовать данные, отправленные через запрос get. Моя проблема в том, что сервер говорит, что запрос не определен. Я абсолютно не знаю, почему это так, поскольку я делаю другие подобные запросы на других страницах, и они работают нормально.
Вот мое сообщение об ошибке:
/var/www/html/AdminExtension/extension/extension/node_modules/find/index.js:35
throw err;
^
Error: ENOENT, lstat '/path/to/project/undefined'
Бит "undefined" - это то, что должно быть остальной частью пути, полученного из запроса.
Вот мой соответствующий код app.js:
var express = require('express');
var MemoryStore = require('connect').session.MemoryStore;
var app = express();
app.set('port', process.env.PORT || 3333);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.set('view options', {layout: false});
app.use(require('morgan')('dev'));
app.use(require('body-parser')({ keepExtensions: true}));
app.use(require('cookie-parser')());
app.use(require('express-session')({ secret: '12345678910', store: new MemoryStore({ reapInterval: 600000}) }));
app.use(require('method-override')());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
next();
});
app.use(express.static(path.join(__dirname, '/public')));
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Methods', 'GET');
next();
});
// Routes for browsing directories and listing contents
var browse = require('./routes/general/browse');
app.get('/browse/file/info', browse.getFileInformation);
app.listen(app.get("port"));
Код browse.js на стороне сервера:
var path = require('path');
var fs = require('fs');
exports.getFileInformation = function(request, response) {
var filePath = "/folder1/folder2/" + request.body.filePath;
console.log('*' + filePath + '*');
checkFileInfo(
filePath,
function(err, fileInfo) {
if (err)
console
.log("An error has occured when trying to retrieve the file information: "
+ err);
else
response.send(fileInfo);
});
};
function checkFileInfo(filePath, callback) {
fs
.lstat(
filePath,
function(err, stats) {
if (err)
return callback(err);
else if (stats && stats.isFile()) {
var fileInfo = {};
fileInfo.size = stats.size;
fileInfo.created = stats.ctime;
fileInfo.modified = stats.mtime;
fileInfo.accessed = stats.atime;
callback(null, fileInfo);
} else
return callback("The path provided did not lead to an accessible file.");
});
}
И запрос ajax на стороне клиента:
var obj = {
filePath : "/relative/path/this_is_a_file.txt"
};
$.ajax({
type : "GET",
url : serverUrl + '/browse/file/info',
data : obj,
dataType : 'json',
success : function(fileData) {
// Do something else
}
});
Я ценю любой вклад.
2 ответа
Как оказалось, мне нужно было использовать
request.query.filePath
вместо
request.body.filePath
Проблема, вероятно, в вашем checkData
функция:
function checkData(data) {
console.log(JSON.stringify(request.body));
return data;
}
Он получает только данные, и вы используете request
объект - он недоступен в своем контексте.
Вы можете добавить еще один параметр с именем request
к этой функции:
function checkData(data, request) {
console.log(JSON.stringify(request.body));
return data;
}
И отправьте ему объект запроса:
checkData(request.body.filePath, request)
ОБНОВИТЬ
После того, как вы обновили свой вопрос, появилась ваша первоначальная проблема.
Я полагаю, что неопределенная проблема, которая у вас возникла, заключается в том, что вы обращаетесь к телу запроса - у запроса есть тело с параметрами, если это POST
запрос (GET
запросы имеют только URL и заголовки).
Попробуйте изменить свой клиентский вызов ajax с type : "GET"
в type : "POST"
и обновите ваш nodejs:
app.get('/browse/file/info', browse.getFileInformation);
в
app.post('/browse/file/info', browse.getFileInformation);
Я также рекомендовал бы получить путь к файлу с __dirname + '/path'
чтобы избежать проблем.