"动态路线"与expressjs

时间:2016-01-11 20:04:04

标签: node.js express

我想创建一个可以在程序运行时更改的路径。 示例:app.get('/',function(req,res){/*Something here*/};这是正常路线。 我想用一个可以用随机数替换的变量替换'/'。之后,我将使用nodejs模块创建一个qrcode,扫描此qrcode的用户将确认一种交易。

如果您了解我的想法并且您有解决方案,我会接受它。

1 个答案:

答案 0 :(得分:0)

正如@Louy所说,使用parameters

var getQRCode = require('./yourQRCodeModule');

app.param('qrcode', function(req, res, next, qrcode) {
  // qrcode will be "1234" if your request path was "/1234"
  console.log('checking qrcode: %s', qrcode);

  // get the qrcode from some asynchronous function
  getQRCode(qrcode, function callback(err, qrcode) {
    // if this number was not a valid dynamic path, return an error from your module

    console.log('qrcode was %s', (!err && qrcode) ? 'valid' : 'invalid');

    if (err) {
      next(err);
    } else if (qrcode) {
      req.qrcode = qrcode; // object from your module
      next();
    } else {
      next(new Error('failed to load QR code'));
    }
  });
});

app.get('/:qrcode', function (req, res) {
  // req.qrcode will be the object from your module
  // if the number was invalid, this will never be called
});

我想要指出的是,您对这种情况的看法与表达方式解决问题的方式不同。您想要一个具有特定qrcode的一次性路由,但这些路由在express中不存在。所以这就是我理解的理想解决方案:

  1. 服务器为qrcode创建“azjzso1291084JKioaio1”
  2. 您注册了app.getOnce("azjzso1291084JKioaio1", function(req, res){...})
  3. 之类的内容
  4. 第一次调用请求时,它将从您的快速路由器中删除
  5. 这就是我的建议:

    1. 服务器为qrcode创建“azjzso1291084JKioaio1”
    2. 您的模块将此qrcode存储在数据库或内存中,在您的模块中,例如var qrcodes = {}; qrcodes["azjzso1291084JKioaio1"] = {some: 'object'};
    3. 基于步骤2中给出的示例的app.param异步函数可能如下所示:
    4. // yourQRCodeModule.js
      var qrcodes = {};
      
      qrcodes["azjzso1291084JKioaio1"] = {some: 'object'};
      
      module.exports = function getQRCode(qrcode, callback) {
        if (qrcodes[qrcode]) {
          var obj = qrcodes[qrcode]; // copy object
          delete qrcodes[qrcode]; // remove from memory here
          callback(null, obj);
        } else {
          // invalid path
          callback(new Error('invalid QR code'), null);
        }
      };
      

      现在请注意,如果您请求/azjzso1291084JKioaio1两次,则第二次失败。如果我没有弄错的话,这就是你打算如何工作的。