배경
Node.js로 실험을하고 있으며 텍스트 파일이나 .js 파일 (더 나은 ??)에서 JSON 객체를 메모리로 읽어 코드에서 빠르게 객체에 액세스 할 수 있습니다. 나는 몽고, 알프레드 등과 같은 것들이 있다는 것을 알고 있지만 그것은 지금 내가 필요한 것이 아닙니다.
질문
JavaScript / 노드를 사용하여 텍스트 나 js 파일에서 서버 메모리로 JSON 객체를 읽으려면 어떻게해야합니까?
Node.js로 실험을하고 있으며 텍스트 파일이나 .js 파일 (더 나은 ??)에서 JSON 객체를 메모리로 읽어 코드에서 빠르게 객체에 액세스 할 수 있습니다. 나는 몽고, 알프레드 등과 같은 것들이 있다는 것을 알고 있지만 그것은 지금 내가 필요한 것이 아닙니다.
JavaScript / 노드를 사용하여 텍스트 나 js 파일에서 서버 메모리로 JSON 객체를 읽으려면 어떻게해야합니까?
답변:
동조:
var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));
비동기 :
var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
if (err) throw err;
obj = JSON.parse(data);
});
let imported = require("file.json")
. (2)이 코드를 사용하여 70MB JSON 파일을 메모리에 객체로로드하기 때문에 JSON.parse는 비동기식이어야합니다. 그것은 밀리 초이 방법이 필요하지만 내가 사용하는 경우 require()
, 그것은 마시기 .
require
했으며 json 파일을로드하려는 경우이 답변을 더 이상 적용 할 수 없습니다. 그냥 사용 let data = require('./yourjsonfile.json')
하고 나가십시오 (요청의 성능이 코드에 영향을 미치는 경우 ".json 파일을로드하고 싶지 않습니다"를 넘어서는 문제가 있음).
내가 찾은 가장 쉬운 방법은 require
JSON 파일의 경로와 경로를 사용 하는 것입니다.
예를 들어 다음 JSON 파일이 있다고 가정합니다.
test.json
{
"firstName": "Joe",
"lastName": "Smith"
}
그런 다음 이것을 사용하여 node.js 응용 프로그램에 쉽게로드 할 수 있습니다 require
var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
test.json
그의 예와 다를 수도 있습니다 . 사용 중node 5.0
require
있으면 해당 코드를 실행합니까? 그렇다면 실제로 json 파일의 출처를 제어해야합니다. 그렇지 않으면 공격자가 컴퓨터에서 악성 코드를 실행할 수 있습니다.
이유가 비동기식입니다! @mihai에서 돌을 던졌습니다.
그렇지 않으면 다음은 비동기 버전에서 사용한 코드입니다.
// Declare variables
var fs = require('fs'),
obj
// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)
// Write the callback function
function handleFile(err, data) {
if (err) throw err
obj = JSON.parse(data)
// You can now play with your datas
}
적어도 Node v8.9.1에서는 할 수 있습니다
var json_data = require('/path/to/local/file.json');
JSON 객체의 모든 요소에 액세스하십시오.
file.json
새로운 요구 후 (프로그램 재시작없이)를 변경하면 첫 번째로드부터 데이터가 생성됩니다. 나는 이것을
노드 8에서는 내장을 사용하여 다음 util.promisify()
과 같은 파일을 비동기 적으로 읽을 수 있습니다
const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)
readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
.then(contents => {
const obj = JSON.parse(contents)
console.log(obj)
})
.catch(error => {
throw error
})
.readFile
동기화 버전을 찾고있는 경우 이름은 .readFileSync
입니다.
fs/promises
노드 10 도 있습니다 . 참고 : API는 실험적입니다. nodejs.org/api/fs.html#fs_fs_promises_api
.readFile
는 비동기식 이지만 비동기식async
입니다. 의미는, 기능은 async
키워드로 정의되지 않았거나 약속을 반환하지 않습니다, 그래서 당신은 할 수 없습니다await fs.readFile('whatever.json');
하여 노드 FS-여분 (비동기 AWAIT)
const readJsonFile = async () => {
try {
const myJsonObject = await fs.readJson('./my_json_file.json');
console.log(myJsonObject);
} catch (err) {
console.error(err)
}
}
readJsonFile() // prints your json object
function parseIt(){
return new Promise(function(res){
try{
var fs = require('fs');
const dirPath = 'K:\\merge-xml-junit\\xml-results\\master.json';
fs.readFile(dirPath,'utf8',function(err,data){
if(err) throw err;
res(data);
})}
catch(err){
res(err);
}
});
}
async function test(){
jsonData = await parseIt();
var parsedJSON = JSON.parse(jsonData);
var testSuite = parsedJSON['testsuites']['testsuite'];
console.log(testSuite);
}
test();
https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfile_file_options_callback
var fs = require('fs');
fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
// options
fs.readFile('/etc/passwd', 'utf8', callback);
https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options
File System 문서에서 Node.js의 모든 사용법을 찾을 수 있습니다!
도움이 되길 바랍니다.
오류 처리를 Async
통해 JSON 파일 을 로드 하기위한 완벽한 솔루션을 찾고 있다면Relative Path
// Global variables
// Request path module for relative path
const path = require('path')
// Request File System Module
var fs = require('fs');
// GET request for the /list_user page.
router.get('/listUsers', function (req, res) {
console.log("Got a GET request for list of users");
// Create a relative path URL
let reqPath = path.join(__dirname, '../mock/users.json');
//Read JSON from relative path of this file
fs.readFile(reqPath , 'utf8', function (err, data) {
//Handle Error
if(!err) {
//Handle Success
console.log("Success"+data);
// Parse Data to JSON OR
var jsonObj = JSON.parse(data)
//Send back as Response
res.end( data );
}else {
//Handle Error
res.end("Error: "+err )
}
});
})
디렉토리 구조 :