2014-05-16 96 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 –