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 的路上你遇到了哪些坑?求各位告知。
这个和 node 无关,你只是对 http 协议不熟而已,用 java、python 照样碰到
这不叫 Node 的坑,这叫个人错误。
确实是我个人问题,但话说 Apache 是不是会自动设置 OPTIONS 路由?
有很多 HTTP 框架或者辅助库处理这类的情况的,不一定要在业务代码里处理,比如说可以看看 https://www.npmjs.com/package/cors
这和 node 无关,cors 我建议还是直接上 nginx 反代掉,这个坑很多
这锅 node 不能背
204 是不是会比 200 更快一些呢?
哈哈哈,确实是我太年轻,感觉会火。感谢各位建议, 有想过用 Nginx 做代理,后期再改善吧!
你一样可以用 Apache 反代 node
不是。
在Node.js开发中,确实可能会遇到一些常见的“坑”,但通过理解和采取最佳实践,可以规避或解决这些问题。以下是一些常见坑点及建议:
-
异步编程: Node.js是异步的,错误处理不当容易导致未捕获的异常。使用
async/await
和try/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();
-
全局变量: 在Node.js中,全局变量可能会不经意间被修改,导致难以调试的问题。避免使用全局变量,使用模块作用域或函数作用域来限制变量范围。
-
第三方库: 依赖的第三方库可能包含漏洞或过时功能。定期更新依赖项,并检查依赖项的安全性和兼容性。
-
内存泄漏: 未关闭的文件描述符、数据库连接等可能导致内存泄漏。使用
fs.promises
代替fs
的回调,确保使用await
或.then()
后关闭文件。 -
路径处理: 使用
path
模块处理文件路径,避免操作系统差异带来的问题。const path = require('path'); const filePath = path.join(__dirname, 'data', 'file.txt'); console.log(filePath);
通过注意这些细节,可以大大减少在Node.js开发中遇到的“坑”。