簡體   English   中英

Node.js忽略代碼以讀取尚​​不存在的文件

[英]Node.js ignoring code to read a file that does not yet exist

我正在嘗試編寫一些基本代碼,以便稍后在更大的聊天機器人中使用。 該代碼接受用戶輸入,檢查文件是否已經存在,如果不存在,請從api中提取數據並保存文件。

我可以使每個部分獨立工作(例如,記下readfile會保存文件,而記下write會成功讀取文件),但是當我嘗試同時運行它們時,會出現ENOENT錯誤。 整個代碼可以在下面看到。

const path = require('path');
const readline = require('readline-sync');
const fs = require('fs');
const request = require('request');

//put api url into variable
const api = "http://vocadb.net/api/";

var command = readline.question("enter a command: ");
//only run with commands that start with !
if (command.startsWith('!')) {
  if (command.startsWith('!artist')) {

    //split input, strip command char and use as file name
    userCommand = command.replace('!', '');
    userCommand = userCommand.split(' ');
    var filename = userCommand[0] + userCommand[1] + ".txt";
    var file = path.basename(filename);

    //if file does not exist, fetch JSON from api and save to file
    if (!fs.existsSync(file)) {
      console.log("true");
      request(api + "artists?query=" + userCommand[1] + "&artistType=producer&lang=English", function(error, response, body) {
        if(err) throw err;
        console.log(body);
        var artist = JSON.parse(body);
        console.log(artist);
        //if json has no items do not create file, print incorrect and stop execuution
        if (artist['items'] == '') {
          console.log("Artist could not be found");
          throw err;
        } else {
          fs.writeFile(file, JSON.stringify(artist), (err) => {
            if (err) throw err;
            console.log('file saved');
          });
        }
      });
    }

    fs.readFile(file, 'utf8', (err, data) => {
      if (err) throw err;
      artist = JSON.parse(data);
      request(api + "songs?artistId=" + artist['items'][0]['id'] + "&maxResults=2&getTotalCount=false&sort=RatingScore&lang=English", function(error, response, body) {
        var songs = JSON.parse(body);
        console.log(artist['items'][0]['name'] + "\n" + artist['items'][0]['defaultName'] + "\n");
        console.log("Top songs:\n" + songs['items'][0]['name'] + "\n" + songs['items'][0]['defaultName'] + "\n" + songs['items'][0]['artistString'] + "\n");
        console.log(songs['items'][1]['name'] + "\n" + songs['items'][1]['defaultName'] + "\n" + songs['items'][1]['artistString']);
      });
    });
  }
}

由於console.log(“ true)確實返回,但是之后什么也沒有,因此節點似乎在請求之前跳過了所有代碼。

到目前為止,我已經嘗試將它們分成功能(可能是更好的禮節),使用request.get(...)。on(...)將readFile更改為readFileSync。

任何幫助將不勝感激

您的代碼只需要進行一些輕微的更正。 由於我無權訪問您的API,因此我使用的是公開的API(last.fm/api),但它與JSON的工作方式幾乎相同。

var fs = require('fs');
var request = require('request');
var api = 'http://ws.audioscrobbler.com/2.0/?callback=&method=';

var file = "test.txt";
var userCommand = 'amy';

if (!fs.existsSync(file)) {
    console.log("file not found");
    request(api + "artist.getinfo&artist=" + userCommand + '&api_key=57ee3318536b23ee81d6b27e36997cde&format=json&_=1520772613660', function(err, response, body) {
        if (err) throw err;
        else {
            var data = JSON.parse(body);
            if (!data.artist) {
                console.error("Artist could not be found");
                throw err;
            } else {
                fs.writeFile(file, JSON.stringify(data), function (err) {
                    if (err) throw err;
                    else console.log('file saved');
                });
            }
        }
    });
} else {
    console.log('found file "' + file + '"');
    fs.readFile(file, 'utf8', function (err,data) {
        if (err) throw err;
        else {
            artist = JSON.parse(data);
            request(api + "artist.getTopTracks&artist=" + userCommand + "&api_key=57ee3318536b23ee81d6b27e36997cde&format=json&_=1520772613660", function(error, response, body) {
                var data = JSON.parse(body);
                //console.log(data)
                var songs = data.toptracks.track;
                songs.forEach(function (song) {
                    console.log(song.name)
                })
            });
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM