繁体   English   中英

如何在 nodejs 中从 JSON 中检索 object?

[英]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 (而不是预期的书籍对象)。

  1. 如何得到object(上面的问题)

  2. 如果async function 始终返回 promise,那么我如何才能为客户端返回 object,而不是他必须从getBook(code)调用then() ) ?

  3. 我需要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));

  1. 上面的问题是从JSON.parse返回的 Books 只有数据,没有方法,因此我无法通过 get code get code(){} ,而只能作为 class Book as book._code的公共参数,但是会中断封装(惯例是_[propery]是私有的,应该有适当的 getters/setters)。 所以我公开了这些属性(并破坏了封装),因为我仍然不知道如何将方法分配给从 JSON 创建的 object。

  2. 不, async的结果总是 Promise。你不能在async中解包它,客户端总是必须解包它。 (因此await fs.promises.WriteFile()将解包它,但在 async function 返回之前立即将其包回去。

  3. 如上所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM