2017-02-13 93 views
0

爲什麼路由不在這裏註冊?出於某種原因,我在訪問/ api/test時遇到404未找到。當我在當時的功能之外移動路線註冊時,它會起作用。這段代碼是從express生成的模板的app.js中添加的。Express JS路由不能在Promise

var Q = require('q'); 

promisify().then(stringText => { 
    var route = express.Router(); 
    route.get('/test', (req, res) => res.send('Hi')); 
    app.use('/api', route); 
}); 

function promisify() { 
    var deferred = Q.defer(); 
    deferred.resolve('Hello World'); 
    return deferred.promise; 
} 

這工作(如果你向外移動的路線註冊):

var Q = require('q'); 

var route = express.Router(); 
route.get('/test', (req, res) => res.send('Hi')); 
app.use('/api', route); 

promisify().then(stringText => { 

}); 

function promisify() { 
    var deferred = Q.defer(); 
    deferred.resolve('Hello World'); 
    return deferred.promise; 
} 

更新:重現步驟從在express鍵入

  1. 創建一個文件夾上明確模板命令行。
  2. 然後安裝包,npm install
  3. 還要安裝第q庫,npm install --save q
  4. 添加的代碼只是註冊等航線的代碼如下:

    app.use('/', index); 
    app.use('/users', users); 
    
    // Add the code above here 
    
+0

我的猜測是,你要離開了「catch-所有「處理程序被安裝來捕獲未處理的請求,而這些請求又將在API處理程序中調用_before_(因爲處理程序被定義的順序)。 – robertklep

回答

0

您是否獲得在控制檯中的任何錯誤?如果沒有你啓動服務器?我試圖做你的邏輯(包括承諾內外的承諾),我發現它與下面的代碼工作http://localhost:3000/api/test

1.Inside無極回調

const express = require('express'); 
const app = express(); 
const Q = require('q'); 

promisify().then(stringText => { 
    console.log("called promise success"); 
    console.log(stringText); 
    var route = express.Router(); 
    route.get('/test', (req, res) => res.send(stringText)); 
    app.use('/api', route); 
}); 

function promisify() { 
    const deferred = Q.defer(); 

    if (true) deferred.resolve('Hello Chris James'); 

    return deferred.promise; 
} 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}) 

2.Outside無極回調

const express = require('express'); 
const app = express(); 
const Q = require('q'); 

var route = express.Router(); 
route.get('/test', (req, res) => res.send('Hi')); 
app.use('/api', route); 

promisify().then(stringText => { 

}); 

function promisify() { 
    var deferred = Q.defer(); 
    deferred.resolve('Hello World'); 
    return deferred.promise; 
} 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!') 
}); 

的package.json

{ 
    "name": "route-check", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1", 
    "start" : "node index.js" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "express": "^4.14.1", 
    "q": "^1.4.1" 
    } 
} 
+0

是的,它被調用。但是,當您通過URL訪問它時,它會發送404郵件。如果您將express.Router移出外部,則URL可以無障礙訪問。 – Chris

+0

我通過瀏覽器訪問了url http:// localhost:3000/api3/test,並使用上面的腳本正常工作。 –

+0

噢,它是有效的。謝謝。我的問題是,當你將代碼放入app.js中時,在一個快速生成的模板中。 – Chris