2017-02-13 73 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