javascript 是否可以保存数据表单API一次,保存在一个变量上,并根据需要在我的 NodeJS 服务器上显示它?

2ic8powd  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(70)

我是新来的节点js。

const http = require('http');
const url = require('url')

http.createServer(function (req, res) {
  const { query, pathname } = url.parse(req.url, true)
  let answer =[];
  async () => {
    await fetch('https://dummyjson.com/products').then(r => r.json()).then(d => {
      answer.push(JSON.stringify(d))
    })
  }

  res.writeHead(200, {
    "Content-Type": 'text/html',
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Headers": "X-Requested-With"
  });
  res.end(answer);
}).listen(8080);

console.log('Server Started');

我试图保存在我的数组中的数据,一旦我得到的信息,我应该能够从该API呈现所有数据。

at0kjp5o

at0kjp5o1#

您有以下几个问题:
1.包含fetch()的异步IIFE永远不会被调用。
1.即使调用了它,您也不会等待它,而是尝试在fetch()完成之前发送响应。
1.您正在尝试发送一个包含res.end()的数组(其中包含JSON)。您无法执行此操作。您需要发送文本。
1.您将content-type设置为text/html,但尝试发送JSON。如果您实际上要发送JSON,则将content-type设置为application/json
变更为:

const http = require('http');
const url = require('url')

http.createServer(async function (req, res) {
  const { query, pathname } = url.parse(req.url, true)
  const answer = [ ];

  const r = await fetch('https://dummyjson.com/products');
  const data = await r.json();

  answer.push(data);

  res.writeHead(200, {
    "Content-Type": 'application/json',
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Headers": "X-Requested-With"
  });
  res.end(JSON.stringify(answer));
  
}).listen(8080);

console.log('Server Started');

变更总结:
1.对http.createServer()的回调被标记为async,因此我们可以在该回调函数中直接使用await
1.删除.then(),只使用await。不要混用await.then()。选择一种风格或另一种。
1.将Javascript数据而不是JSON推入数组。
1.对整个数组调用JSON.stringify()。你可以传递一个数组给res.end(),你必须传递文本。
1.将内容类型更改为application/json

wljmcqd8

wljmcqd82#

另一个调整是,您只希望数据被提取一次,您可以通过将data变量拉到模块级别并检查值来实现这一点:

const http = require('http');
const url = require('url')
 
let data;

http.createServer(async function (req, res) {
  const { query, pathname } = url.parse(req.url, true)
  const answer = [ ];

  if(! data) 
      data = await fetch('https://dummyjson.com/products').then(r=> r.json())        
  answer.push(data);

  res.writeHead(200, {
    "Content-Type": 'application/json',
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Headers": "X-Requested-With"
  });
  res.end(JSON.stringify(answer));
  
}).listen(8080);

console.log('Server Started');

如果你使用像lodash这样的函数,你可以记忆获取,或者你可以调用你自己的记忆函数。

相关问题