[英]How to retrieve object from JSON in nodejs?
有这个代码:
const fs = require('fs')
const file = 'books.json';
class Book{
constructor(code) {
this._code = code;
}
get code() {
return this._code;
}
set code(value) {
this._code = value;
}
}
async function writeBooks(){
const data = JSON.stringify([new Book('c1'), new Book('c2')]);
await fs.promises.writeFile(file, data, 'utf8');
}
async function getBook(code){
try{
const data = await fs.promises.readFile(file);
const array = JSON.parse(data);
return array.find(b => b.code === code);
} catch (err){
console.log(err)
}
}
writeBooks();
getBook('c1').then(b => console.log(b));
我变得undefined
(而不是预期的书籍对象)。
如何得到object(上面的问题)
如果async
function 始终返回 promise,那么我如何才能为客户端返回 object,而不是他必须从getBook(code)
调用then()
) ?
我需要await
fs.promises.writeFile()
吗? 正如我在writeBooks()
中所做的那样? 据我现在对async/await
的理解, await
function 的返回值是数据还是错误。 但是由于writeFile()
不返回任何内容,或者最多不返回错误(与readFile()
相对),为什么我要await
没有数据?
实际上,问题的根源不在于异步/等待或承诺。 问题是试图将数组写入 json 文件。 如果您像下面的代码片段一样编写 json 数据(作为键值对),您的问题就解决了。
{"1": [new Book('c1').code, new Book('c2').code]} //as a key-value pair
const fs = require('fs') const file = 'books.json'; class Book{ constructor(code) { this._code = code; } get code() { return this._code; } set code(value) { this._code = value; } } async function writeBooks(){ const data = JSON.stringify({"1": [new Book('c1').code, new Book('c2').code]}); await fs.promises.writeFile(file, data, 'utf8'); } async function getBook(code){ try{ const data = await fs.promises.readFile(file); const dataOnJsonFile = JSON.parse(data); return dataOnJsonFile["1"]; } catch (err){ console.log(err) } } writeBooks(); getBook('c1').then(b => console.log(b));
上面的问题是从JSON.parse
返回的 Books 只有数据,没有方法,因此我无法通过 get code
get code(){}
,而只能作为 class Book
as book._code
的公共参数,但是会中断封装(惯例是_[propery]
是私有的,应该有适当的 getters/setters)。 所以我公开了这些属性(并破坏了封装),因为我仍然不知道如何将方法分配给从 JSON 创建的 object。
不, async
的结果总是 Promise。你不能在async
中解包它,客户端总是必须解包它。 (因此await fs.promises.WriteFile()
将解包它,但在 async function 返回之前立即将其包回去。
如上所述。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.