【问题标题】:Express JS Routes Not Working Inside PromiseExpress JS 路由在 Promise 中不起作用
【发布时间】:2017-07-01 00:49:44
【问题描述】:

为什么这里没有注册路由?出于某种原因,当我访问 /api/test 时出现 404 未找到。当我将路由注册移到 then 函数之外时,它可以工作。此 sn-p 是从快速生成的模板中的 app.js 添加的。

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;
}

更新:重现步骤

  1. 通过在命令行中输入 express 在文件夹上创建一个快速模板。
  2. 然后安装包,npm install
  3. 同时安装q库npm install --save q
  4. 在注册其他路由的代码下方添加代码:

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

【问题讨论】:

  • 我的猜测是您遗漏了一个“包罗万象”的处理程序,该处理程序被安装以捕获未处理的请求,而该处理程序又会在 API 处理程序 之前被调用(因为定义处理程序的顺序)。

标签: node.js express


【解决方案1】:

您是否在控制台中遇到任何错误?如果没有,您是否已启动服务器?我尝试执行您的逻辑(无论是在承诺内还是在承诺外),我发现它可以在http://localhost:3000/api/test

上使用下面的代码

1.Inside Promise 回调

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.外部Promise回调

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!')
});

包.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"
  }
}

【讨论】:

  • 是的,它正在被调用。但是当你通过 URL 访问它时,它会发送 404。如果你将 express.Router 移出外部,则 URL 可以正常访问。
  • 我通过浏览器访问了 url localhost:3000/api3/test,使用上面的脚本对我来说工作正常。
  • 哦,是的,它有效。谢谢。我的问题是在快速生成的模板中,当您将该代码放在 app.js 中时。
  • 能否提供我认为对调试有帮助的问题中的全部代码?
  • 我更新了复制步骤。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多