2012-07-26 88 views
2

我很確定我在我的應用程序某處發生了一些愚蠢的錯誤,但我似乎無法找到它。爲什麼我的Node應用程序在此POST請求上返回404?

所以這裏是我的快車應用程序的樣子。我有我的路線設置爲:

var routes = require('./routes'); 
... 
app.get('/', routes.index); 
app.get('/embed', routes.embed); 
app.post('/upload', routes.upload); 

在我的路線文件夾中,我有兩個文件。 index.js文件導出兩個請求處理程序.index.embed。這可能是讓你知道,.embed創建一個CSRF令牌可以在/embed頁面上使用:

exports.embed = function(req, res){ 
    var csrf = req.session._csrf; 
    res.render('embed', { token: csrf }); 
}; 


form#secret-form(name="secret-form", method="post", action="/upload", style="") 
    input(type="hidden", name="_csrf", value="#{token}") 
    input(type="hidden", name="image") 
    input#send-button(type="submit") Upload 

只是一個簡短的說明,如果它造成問題:我沒有附上.submit jQuery的處理程序,以這種形式;它只是從該頁面上的畫布對象抓取數據URL,並將其作爲名稱爲「image」的輸入字段的值。

.upload路由在routes/upload.js文件中處理。它看起來是這樣的:

exports.upload = function(req, res) { 
    console.log("Receiving upload..."); 
    var imageURL = req.body.image; 
    // snippet of code that grabs a canvas data URL and stores it in a file 
}; 

我不認爲這個功能的事項的內容,因爲我得到的請求從/embed形式將/upload以下日誌輸出。它甚至不打印「接收上傳...」行;它只是返回一個頁面,上面寫着「無法開機自檢/上傳」:

127.0.0.1 - - [Thu, 26 Jul 2012 04:07:41 GMT] "POST /upload HTTP/1.1" 404 - "http://0.0.0.0:3000/embed" 

那麼,我可能在這裏做錯了什麼?它是我的應用程序配置嗎?我懷疑它可能是這樣的,因爲POST請求在添加CSRF支持後停止工作。但現在我只是猜測......

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    //app.use(express.limit('1mb')); 
    app.use(express.query()); 
    app.use(express.logger()); 

    // CSRF stuff 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret: "secret", cookie: { maxAge: 60000 } })); 
    app.use(express.csrf()); 

    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 
+0

貴'路線/指數。 js'文件使用'require'拉入'routes/upload.js'? – JohnnyHK 2012-07-26 04:34:06

+0

現在它(在文件的頂部添加'var upload = require(「./ upload.js」)),但它沒有幫助。我認爲,如果它沒有被正確包含,我會得到一個異常,而'routes.upload'的行未定義。 – kibibyte 2012-07-26 04:39:10

+0

您還需要將'upload'添加到'index.js'的'exports'。 – JohnnyHK 2012-07-26 04:42:26

回答

0

index.js文件應該是這個樣子,這樣routes.upload實際上指的是upload出口upload.js

exports.upload = require('./upload').upload; 

exports.index = function(... 

exports.embed = function(... 
+1

我覺得在其他Node初學者遇到這種情況時,後續工作是必要的:令我驚訝的是,事實證明,如果請求處理程序是'null'甚至'undefined',Express實際上不會引發錯誤。另外,它也證明'require('./ routes')'實際上並不包含整個目錄。 – kibibyte 2012-07-26 06:01:35

相關問題