到期路由生成NodeJS

时间:2016-05-28 21:56:10

标签: node.js express

我想在ExpressJS上设置具有唯一随机字符串路径的临时路由。这些路由应该是动态创建的,如果有人在创建uniqueid后30分钟尝试使用ie http://example.com/login/a434bcd34d920bdfe,则应该给出404。

关于如何做到这一点的任何想法?我对NodeJS很陌生,但从我所看到的情况来看,应该有一个库可以做到这一点:) 这样的事可能吗?

// =========== app.js ============
app.get('/generate_url', function(req, res) {
    // random string: "a434bcd34d920bdfe"
    var extension = randomstring.generate();

    var dynamicController = require('./login/'+extension);
    dynamicController.init(app);

    // Should expire in 20 minutes
    dynamicController.expire(20*60)
    res.status(200).send();
}

// =========== login.js ============
login.post('/login/:uniqueid', function(req, res) {
  // uniqueid should match the extension generated before
  var uniqueid = req.query.unique;
  var username = req.body.username;

  // Do something with this info
}

我认为这远远不能正常工作,但至少可能是某人完成了

2 个答案:

答案 0 :(得分:1)

你问了两个问题:

  1. 如何创建路线。
  2. 如何保存有关过期链接的数据。
  3. 1。如何创建路线:

    您必须创建一个接收来自所有用户的流量的路由,并检查特定URL是否有效。

    1. 首先,您创建一条获取所有用户流量的路由。

      app.get('/myroute/:id',function(){
          /*  This route will get any url that start with /myroute/
              For example /myroute/abc
               /myroute/def
          */
          // req.params.id  ==  what the URL is entered
          if (is_expired(req.params.id)) return res.end('Sorry your link has expired')
          res.send('Great you logged in!')
      })
      app.post('/login/:uniqueid', function(req, res) {
          set_expire(req.params.uniquieid,30*1000*60) //30 minutes = 30*60*1000 miliseconds.
      })
      
    2. 2。如何保存有关过期链接的数据。

      如何实施set_expireis_expired

      您需要实现使用任何类型的数据库。 Redis非常有用。我将向您展示如何做到这一点 使用setTimeout。它会工作。但是如果服务器重启,所有用户都将被注销。

      users={}
      function is_expired(uid){
              return users[uid]
      }
      function set_expire(uid,time){
              users[uid]=true
              setTimeout(function(){
                      delete users[uid]                   
              },time)
      }
      

答案 1 :(得分:0)

通常这是通过通用路由器处理程序完成的,然后查询某些数据存储以查看请求中发送的ID是否有效。

另请注意,来自'/login/:uniqueid'等路线规范的值可在req.params.uniqueid中找到,而不是req.query.uniqueidreq.query用于实际查询参数(URL中?之后的内容)。

var validIds = {};

// =========== app.js ============
app.get('/generate_url', function(req, res) {
    // generate random string: "a434bcd34d920bdfe"
    // make sure it's not already in use
    var extension;
    do {
        extension = randomstring.generate();
    } while (validIds[extension]);

    // save this random string as a valid ID and store the expiration time
    validIds[extension] = {expiration: Date.now() + 20 * 60 * 1000};

    // return the random value to the caller
    res.json(extension);
}

app.post('/login/:uniqueid', function(req, res) {
    // uniqueid should match the extension generated before
    var uniqueid = req.params.unique;
    var username = req.body.username;

    // now see if the id is still valid
    var idInfo = validIds[uniqueid];
    if (!idInfo || idInfo.expiration < Date.now()) {
        return res.sendStatus(404);
    }

    // id is valid, do something with this info

 }

然后,您可以使用一些间隔计时器来定期清理任何过期的ID。这只是用于保持validIds对象不会永远增长的内务处理 - 在验证id之前仍会检查实际的到期值。

// clean up expired validIds object every 10 minutes
setInterval(function() {
    var now = Date.now();
    for (var id in validIds) {
        if (validIds[id].expiration < now) {
            delete validIds[id];
        }
    }
}, 10 * 60 * 1000);

注意:由于您可能希望您的uniqueID在服务器重新启动后继续存在,因此您需要定期将它们保存到某种后备存储(数据库,平面文件等),然后您需要在其中读取该数据服务器启动。

如果您想要任何类型的用户活动,请&#34;续订&#34;对于uniqueid的超时,您可以安装一些中间件,以便在适当的访问时重置时间。