Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复node.js中的内存问题?_Node.js_Json_Express - Fatal编程技术网

如何修复node.js中的内存问题?

如何修复node.js中的内存问题?,node.js,json,express,Node.js,Json,Express,我得到以下错误。 正如我所检查的,由于服务器内存不足,json文件似乎太大而无法运行 我们如何解决这个问题? 有一种叫做节点流的东西,我很难理解。你能解释得更简单些吗 server.js const express = require('express'); const cors = require('cors'); const userJson = require('./user'); const locationJson = require('./location'); const API

我得到以下错误。 正如我所检查的,由于服务器内存不足,json文件似乎太大而无法运行

我们如何解决这个问题? 有一种叫做节点流的东西,我很难理解。你能解释得更简单些吗

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}`));
错误消息

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”)返回buf.utf8Slice(开始,结束); ^ 错误:无法创建长度超过0x3fffffe7个字符的字符串 在stringSlice(buffer.js:585:43) 在Buffer.toString(Buffer.js:655:10) 在Object.readFileSync(fs.js:392:41) at Object.Module._extensions..json(internal/modules/cjs/loader.js:816:22) 在Module.load(内部/modules/cjs/loader.js:666:32) 在tryModuleLoad(内部/modules/cjs/loader.js:606:12) at Function.Module._load(内部/modules/cjs/loader.js:598:3) at Module.require(内部/modules/cjs/loader.js:705:19) 根据需要(内部/modules/cjs/helpers.js:14:16) 反对。(/Users/k/Desktop/dev/backend/location.js:1:22)
您可以将文件流式传输,并将其直接导入res:

const fs = require('fs');
const path = require('path');

const getBigJson = (req, res, next) => {
    const pathToJson = path.join(__dirname, 'path/to/file');
    const jsonStream = fs.createReadStream(pathToJson);
    res.set({'Content-Type': 'application/json'});
    jsonStream.pipe(res);
};

它应该一块一块地发送,而不会耗尽您的内存


有关流的详细说明,请参阅。

流似乎是您唯一的选择。你不明白什么?文档中有很多例子。基本上,您创建一个流,然后通过管道将其传输到您想要的任何流程函数。此函数将以块的形式接收数据。使用流是否意味着与拆分数据相同?例如,它是否比人工分配10个单位的内存更有效?使用流比分配额外内存更快?我不知道节点中内存管理是如何工作的,但您可以看看这个问题:
require('./user')
require('./location')
是您的问题线(假设它们确实太大)。您需要创建一个,并且只有在数据加载后,才能实例化快速路线,而不仅仅是
require
。编辑看起来还有一个npm模块在这里可能会有所帮助。Selblor&romellem非常感谢:)