Nodejs 心中有坑,处处是坑

Nodejs 心中有坑,处处是坑

记录一个 Node 的坑

新手接触 Node 不到一个月,遇到了很多坑

后端代码是这样写的:

app.all('*', function(req, res, next) {
	res.header("Access-Control-Allow-Origin", "*"); 
	res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
	res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); 
	res.header("X-Powered-By", ' 3.2.1')
	res.header("Content-Type", "application/json;charset=utf-8");
	next();
});

然而前端每次发送 AJAX 跨域请求时都收不到结果,错误信息为网关超时

 XMLHttpRequest cannot load http://111.111.111.111:8089/login_service. Response to
 preflight request doesn't pass access control check: No
 'Access-Control-Allow-Origin' header is present on the requested resource. Origin
 'http://111.111.111.111' is therefore not allowed access. The response had HTTP
 status code 504.

后来发现前端使用 CORS 请求时content-type取值为application/json; charset=utf-8,也就是说发送跨域请求时会发送 OPTIONS 预检请求,而我没有对设置 OPTIONS 路由,因此成功入坑。后来把后端代码改为了

app.all('*',function (req, res, next) {
	res.header('Access-Control-Allow-Origin', '*');
	res.header('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
	res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
if (req.method == 'OPTIONS') {
   console.log('you can do that!!');
   res.send(200); // 让 options 请求快速返回
} else {
	next();
}

});

写在最后

从坑中出来了,颇有感慨。顺便记录了一下对 CORS 跨域的探索,可能是知识盲点太多所以入坑太多,Node 的路上你遇到了哪些坑?求各位告知。


13 回复

这个和 node 无关,你只是对 http 协议不熟而已,用 java、python 照样碰到


这不叫 Node 的坑,这叫个人错误。

确实是我个人问题,但话说 Apache 是不是会自动设置 OPTIONS 路由?

有很多 HTTP 框架或者辅助库处理这类的情况的,不一定要在业务代码里处理,比如说可以看看 https://www.npmjs.com/package/cors

这和 node 无关,cors 我建议还是直接上 nginx 反代掉,这个坑很多

这锅 node 不能背

204 是不是会比 200 更快一些呢?





哈哈哈,确实是我太年轻,感觉会火。感谢各位建议, 有想过用 Nginx 做代理,后期再改善吧!

你一样可以用 Apache 反代 node

你不用 express 就得自己实现全套啊,不然还是老老实实用 express 吧

在Node.js开发中,确实可能会遇到一些常见的“坑”,但通过理解和采取最佳实践,可以规避或解决这些问题。以下是一些常见坑点及建议:

  1. 异步编程: Node.js是异步的,错误处理不当容易导致未捕获的异常。使用async/awaittry/catch可以更好地管理异步流程和错误。

    async function fetchData() {
        try {
            const response = await fetch('https://api.example.com/data');
            const data = await response.json();
            console.log(data);
        } catch (error) {
            console.error('Error fetching data:', error);
        }
    }
    
    fetchData();
    
  2. 全局变量: 在Node.js中,全局变量可能会不经意间被修改,导致难以调试的问题。避免使用全局变量,使用模块作用域或函数作用域来限制变量范围。

  3. 第三方库: 依赖的第三方库可能包含漏洞或过时功能。定期更新依赖项,并检查依赖项的安全性和兼容性。

  4. 内存泄漏: 未关闭的文件描述符、数据库连接等可能导致内存泄漏。使用fs.promises代替fs的回调,确保使用await.then()后关闭文件。

  5. 路径处理: 使用path模块处理文件路径,避免操作系统差异带来的问题。

    const path = require('path');
    const filePath = path.join(__dirname, 'data', 'file.txt');
    console.log(filePath);
    

通过注意这些细节,可以大大减少在Node.js开发中遇到的“坑”。

回到顶部