通过nodejs,njs脚本语言扩展nginx

问题描述

我在nginx文档上找到了可以使用的部分

带有某些ECMAScript 6和更高扩展名的ECMAScript 5.1(严格模式)

扩展nginx。作为用例

在请求到达上游服务器之前,在njs中进行复杂的访问控制和安全检查

https://nginx.org/en/docs/njs/

不,我不知道我是否能够连接到数据库并执行与node.js类似的操作。甚至在Nginx进程内“运行”节点。但是我认为我的卡不好,因为目前只有两个模块,它们不提供网络套接字之类的功能,但是,其中有一节“在njs中使用节点模块”:https://nginx.org/en/docs/njs/node_modules.html

仅对外部库或net,dgram等“节点内部”起作用吗?

解决方法

是 Javascript 的 subset,目前缺乏任何直接与外部进程接口的方式,但是可以向 本地 路由发出子请求,这些路由又可以代理其他服务。我在研究类似要求时偶然发现了您的问题,并在此处发布了一个简单示例:

最有效的解决方案意味着围绕您的数据库连接创建一个瘦包装器并将其部署为独立的网络服务,然后设置一个内部路由来反向代理连接:

location /internal-service {
    internal;
    proxy_pass http://<hostname>:<port>;
}

然后您的 njs 脚本可以通过调用:

response.subrequest(
    '/internal-service',{
        method: 'GET',},serviceResponse => {
        // some logic... 
        response.return(200)
    }
)

可能还有其他解决方法,但这种方法目前似乎是最可靠的。不幸的是,它确实使开发自包含模块变得困难 - 我怀疑这就是为什么没有真正可用的可重用包的原因之一。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...