2014-05-16 98 views
0

我遇到了一个问题,我的Node.js应用程序通过ajax调用客户端发送http get请求,然后接收请求服务器端,并尝试使用通过get请求发送的数据。我的问题是,服务器说,请求是未定义的。我完全不知道为什么会出现这种情况,因为我在其他页面上做了其他类似的请求,并且它们工作正常。未定义的HTTP GET请求由Node.js服务器解释

这是我的错误信息:

/var/www/html/AdminExtension/extension/extension/node_modules/find/index.js:35 
      throw err; 
       ^
Error: ENOENT, lstat '/path/to/project/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 
    } 
}); 

我很感激任何意见。

回答

0

事实证明,我需要使用的

request.query.filePath 

代替

request.body.filePath 
+0

我认为你还应该看看我更新的答案 - 当你上传文件时,你应该使用POST而不是GET。 –

2

的问题可能是在你的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) 

UPDATE

您更新后的问题你的原始问题出现了。

我geuss未定义的问题,你到达那里是因为你正在访问请求正文 - 一个请求有一个参数的身体,如果它是一个POST请求(GET请求只有一个URL和标题)。

试着改变从type : "GET"客户端AJAX调用type : "POST"和更新您的NodeJS:

app.get('/browse/file/info', browse.getFileInformation); 

app.post('/browse/file/info', browse.getFileInformation); 

我也建议得到一个文件路径与__dirname + '/path',以避免出现问题。

+0

你是对的。我在那里犯了一个错误。但是,我只是最近才添加了这个功能,问题依然存在。函数的目的是试图找出请求内部的内容(尽管它仍然是未定义的)。尽管如此,痕迹有点不同。谢谢你多一双眼睛。 我更新了问题。 –

+0

你确定你已经更新了你的问题吗?我正在查看它,并看到导致checkData中的问题的完全相同的堆栈跟踪。 –

+0

在编辑问题之前,我写了评论。现在应该是好的。 XD –