【发布时间】:2019-10-30 21:41:10
【问题描述】:
我收到以下错误。 我检查了一下,似乎是因为服务器内存不足,json文件太大而无法运行。
我们如何解决这个问题? 有一个东西叫 Node streaming,我很难理解。能不能简单点解释一下?
server.js
const express = require('express');
const cors = require('cors');
const userJson = require('./user');
const locationJson = require('./location');
const API_PORT = process.env.PORT || 3002;
const app = express();
app.use(cors());
const router = express.Router();
router.get("/getUserData", (req, res) => {
return res.json(userJson);
});
router.get("/getLocationData", (req, res) => {
return res.json(locationJson);
});
app.use("/api", router);
app.listen(API_PORT, () => console.log(`LISTENING ON PORT ${API_PORT}`));
错误消息
buffer.js:585
if (encoding === 'utf8') return buf.utf8Slice(start, end);
^
Error: Cannot create a string longer than 0x3fffffe7 characters
at stringSlice (buffer.js:585:43)
at Buffer.toString (buffer.js:655:10)
at Object.readFileSync (fs.js:392:41)
at Object.Module._extensions..json (internal/modules/cjs/loader.js:816:22)
at Module.load (internal/modules/cjs/loader.js:666:32)
at tryModuleLoad (internal/modules/cjs/loader.js:606:12)
at Function.Module._load (internal/modules/cjs/loader.js:598:3)
at Module.require (internal/modules/cjs/loader.js:705:19)
at require (internal/modules/cjs/helpers.js:14:16)
at Object.<anonymous> (/Users/k/Desktop/dev/backend/location.js:1:22)
【问题讨论】:
-
Streams 似乎是您唯一的选择。你有什么不明白 ?该文档有很多示例。基本上,您创建一个流,然后将其通过管道传输到您想要的任何处理函数。该函数将分块接收数据。
-
使用流和拆分数据的意思一样吗?例如,它是否比人为分配 10 个内存单元更有效?使用流比分配额外内存更快?
-
我不知道 Node 中的内存管理是如何工作的,但是你可以看看这个问题:stackoverflow.com/questions/42896447/…
-
require('./user')和require('./location')是您的问题线(假设它们确实太大了)。您需要创建一个Readable Stream,而不仅仅是require,并且只有在加载数据后,才能实例化您的快速路线。 EDIT 看起来还有一个 npm 模块 JSONStream 在这里可能会有所帮助。 -
Selblor & romellem 非常感谢 :)