node.js - 部署到heroku时express-rate-limit不起作用

标签 node.js express heroku

我在 localhost 上运行此代码(发送只有 express-rate-limit 没有问题),但是当我将它部署/推送到我的 heroku 应用程序并执行发布请求时,它超过了最大限制,即 3。

const router = require('express').Router();
const nodemailer = require('nodemailer');
const rateLimit = require("express-rate-limit");

const apiLimit = rateLimit({
    windowMs: 24 * 60 * 60 * 1000, // 24 hrs
    max: 3, // limit each IP to 3 requests per windowMs
    message: "Spam detected!"
});

router.route('/').post(apiLimit,(req, res) => {

    const transport = nodemailer.createTransport({
        service: 'gmail',
        host : "smtp.gmail.com",
        port : "465",
        ssl : true,
        auth: {
        user: process.env.USER,
        pass: process.env.PASS
    }
    });

    const mailOptions = {
        from: '',
        to: '<myemail>',
        subject: req.body.subject,
        text: "FROM: "+ req.body.email + " MESSAGE: " + req.body.message
    };

    transport.sendMail(mailOptions, (err, info) => {
        err ? res.json(res.status(400).json("Error " + err)) : res.json("Email sent.");
    });

});

module.exports = router ;

在本地主机上服务有效,当我请求超过 3 倍时,它返回检测到的垃圾邮件消息并且不再发送邮件。当我在 vscode 上使用 rest api 扩展时,这显示了。 X-Ratelimit-Remaining: 2 如果我再做一些发布请求,则不会改变。

HTTP/1.1 200 OK
Server: Cowboy
Connection: close
X-Powered-By: Express
Access-Control-Allow-Origin: *
X-Ratelimit-Limit: 3
X-Ratelimit-Remaining: 2
Date: Sun, 21 Jun 2020 03:09:11 GMT
X-Ratelimit-Reset: 1592793933
Content-Type: application/json; charset=utf-8
Content-Length: 13
Etag: W/"d-EBrE0f9LbjD0DZTwvOVLMa8Lqo8"
Via: 1.1 vegur

"Email sent."

最佳答案

当您在 heroku 上运行 express-rate-limit 模块时,它似乎没有为客户端获取正确的 IP 地址?也许是因为 heroku 在你的服务器前使用了代理?

根据 express-rate-limit documentation :

// Enable if you're behind a reverse proxy (Heroku, Bluemix, AWS ELB, Nginx, etc)
// see https://expressjs.com/en/guide/behind-proxies.html
// app.set('trust proxy', 1);

所以,看起来你可能需要:

app.set('trust proxy', 1);

这将导致 req.ipreq.ips 值被 X-Forwarded-For header 中的地址列表填充,这可能是什么表达-在代理后面运行时需要速率限制器。

关于node.js - 部署到heroku时express-rate-limit不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62494060/

相关文章:

node.js - zsh : command not found: npm

javascript - C++ 级别的 nodeJS 模块加载

javascript - ACL express.js 允许角色访问子路径

heroku - 如何在 Heroku 部署的 Play 中设置框架 id!应用

python - 如何将 python 依赖项添加到 heroku Node 服务器?

javascript - 如何在 HTML 表单中发回一个预设数据字段?

node.js - 在返回结果之前如何确保 Mongoose 查询已完成?

node.js - ExpressJS 后端将请求放入队列

javascript - 发送cookie到浏览器

heroku - 限制对 heroku 应用程序的访问