Google App Engine的安全Cron作业无法启动(节点js)

时间:2017-07-10 13:21:35

标签: node.js google-app-engine cron

我正在谷歌应用引擎中使用安全网址的cron工作挣扎。 只要我在 app.yaml 中添加 login:admin ,作业就无法启动(否则它就像魅力一样)。

这是我的代码:

  • app.js

    
    
    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.status(200).send('Hello, world!').end();
    });
    
    app.get('/admin', function(req, res){
    	res.status(200).send('Hello, admin!').end();
    });
    
    
    // Start the server
    const PORT = process.env.PORT || 8080;
    app.listen(PORT, () => {
      console.log(`App listening on port ${PORT}`);
      console.log('Press Ctrl+C to quit.');
    });
    
    
    

  • 的app.yaml

    
    
    runtime: nodejs
    env: flex
    
    handlers:
    - url: /
      script: app.js
      
    - url: /admin
      login: admin
      script: app.js
    
    
    

  • cron.yaml

    
    
    cron:
    - description: daily summary job
      url: /admin
      schedule: every 12 mins
      target: default
    
    
    

结果: cron failure

对我遗失的内容有何提示?

提前多多感谢

1 个答案:

答案 0 :(得分:2)

App Engine灵活环境现已弃用login下的handlers设置。 https://cloud.google.com/appengine/docs/flexible/nodejs/upgrading

login: admin应从app.yaml中移除。

您仍然可以通过检查代码中的X-Appengine-Cron标头来保护网址。

app.get('/admin', function(req, res){
    if (req.get('X-Appengine-Cron') !== 'true') {
         return res.status(401).end();
    }
    res.status(200).send('Hello, admin!');
});

根据docs

  

X-Appengine-Cron标头由Google App Engine在内部设置。如果您的请求处理程序找到此标头,则它可以信任该请求是cron请求。如果标题存在于应用程序的外部用户请求中,则会被删除,但应用程序的已登录管理员的请求除外,这些请求允许设置标题以用于测试目的。