fs.약속에 파일을 쓰시오, 비동기-동기적인 것
제 코드에 도움이 필요합니다.저는 Node.js에 새로 와서 문제가 많습니다.
내가 하려는 일:
Amazon 제품(ASIN)으로 .txt 가져오기;
amazon-product-api 패키지를 사용하여 모든 제품을 가져옵니다.
각 제품을 .json 파일에 저장합니다.
제 코드가 작동하지 않습니다.내가 이 비동기식 일을 망친 것 같아요 - 도와주세요!
var amazon = require('amazon-product-api');
var fs = require('fs');
var client = amazon.createClient({
awsId: "XXX",
awsSecret: "XXX",
awsTag: "888"
});
var array = fs.readFileSync('./test.txt').toString().split('\n');
for (var i = 1; i < array.length; i++) {
var ASIN = array[i];
client.itemLookup({
domain: 'webservices.amazon.de',
responseGroup: 'Large',
idType: 'ASIN',
itemId: ASIN
})
.then(function(results) {
fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) {
if (err) {
console.log(err);
} else {
console.log("JSON saved");
}
})
return results;
}).catch(function(err) {
console.log(err);
});
};
2019년 현재...
...노드에 포함된 네이티브 약속 모듈과 비동기/await을 사용하는 것이 정답입니다.Node.js 10 또는 11(주요 클라우드 공급자에서 이미 지원됨)로 업그레이드하고 다음 작업을 수행합니다.
const fs = require('fs').promises;
// This must run inside a function marked `async`:
const file = await fs.readFile('filename.txt', 'utf8');
await fs.writeFile('filename.txt', 'test');
타사 패키지를 사용하지 말고 직접 포장지를 작성하지 마십시오. 더 이상 필요하지 않습니다.
더 이상 실험적이지 않습니다.
노드 전11.14.0, 여전히 이 기능이 실험적이라는 경고를 받을 수 있지만, 잘 작동하며 앞으로 가야 할 길입니다.부터11.14.0, 이 기능은 더 이상 실험적이지 않으며 생산 준비가 완료되었습니다.
내가 원한다면 어쩌죠?import대신에require?
이 기능이 실험적인 것으로 표시되지 않은 Node.js 버전에서만 작동합니다.
import { promises as fs } from 'fs';
(async () => {
await fs.writeFile('./test.txt', 'test', 'utf8');
})();
왜냐면fs.writefile는 기존의 비동기 콜백입니다. 약속 사양을 따르고 다음과 같이 해결 및 거부 핸들러로 포장된 새 약속을 반환해야 합니다.
return new Promise(function(resolve, reject) {
fs.writeFile("<filename.type>", data, '<file-encoding>', function(err) {
if (err) reject(err);
else resolve(data);
});
});
그래서 당신의 코드에서 당신은 당신이 전화를 한 후 바로 그렇게 사용할 것입니다..then():
.then(function(results) {
return new Promise(function(resolve, reject) {
fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) {
if (err) reject(err);
else resolve(data);
});
});
}).then(function(results) {
console.log("results here: " + results)
}).catch(function(err) {
console.log("error here: " + err);
});
말합니다
const util = require('util')
const fs_writeFile = util.promisify(fs.writeFile)
https://nodejs.org/api/util.html#util_util_promisify_original
이는 상위 voted 답변보다 버그가 발생하기 쉽습니다.
마지막으로 최신 node.js 릴리스 v10.3.0은 기본적으로 fs 약속을 지원합니다.
const fsPromises = require('fs').promises; // or require('fs/promises') in v10.0.0
fsPromises.writeFile(ASIN + '.json', JSON.stringify(results))
.then(() => {
console.log('JSON saved');
})
.catch(er => {
console.log(er);
});
자세한 사항은 공문서를 확인하실 수 있습니다.https://nodejs.org/api/fs.html#fs_fs_promises_api
약속 기반 버전을 가져오려면fsES 모듈로서 다음을 수행할 수 있습니다.
import { promises as fs } from 'fs'
await fs.writeFile(...)
노드 v14가 릴리스되는 즉시(이 PR 참조) 사용할 수도 있습니다.
import { writeFile } from 'fs/promises'
제게 효과가 있었던 건 약속이었죠
예제 1:
const fs = require("fs")
fs.promises
.writeFile(__dirname + '/test.json', "data", { encoding: 'utf8' })
.then(() => {
// Do whatever you want to do.
console.log('Done');
});
예제 2.Async-Wait 사용:
const fs = require("fs")
async function writeToFile() {
await fs.promises.writeFile(__dirname + '/test-22.json', "data", {
encoding: 'utf8'
});
console.log("done")
}
writeToFile()
2017년 9월 업데이트:fs-promise을 찬성하여 감가상각하였습니다.
사용해 본 적은 없지만, fs-promise를 알아봐 주시면 됩니다.노드 모듈은 다음을 수행합니다.
약속/A+ 호환 약속(언제, Q 등)으로 노출되는 모든 비동기 메서드를 프록시합니다.모든 동기화 메서드를 값으로 전달합니다.
2023, v16+, ESM,import해서,
()를 피하기 try..catch록, YMMV.
import * as fs from 'node:fs/promises';
async function doFile(filepath) { // choose a better name than `doFile` for your use case!!
try {
const fileData = await fs.readFile(filepath, {encoding: 'utf8'});
var array = fileData.toString().split('\n');
for (var i = 1; i < array.length; i++) {
var ASIN = array[i];
let results = await doClientStuff(args); // e.g. client.itemLookup
await saveResults(ASIN, results);
};
} catch (error) {
console.error(error?.message ?? error?.toString()); // or however you extract your error msg
}
}
async function saveResults(ASIN, results) {
try {
await fs.writeFile(ASIN + '.json', JSON.stringify(results));
console.log("JSON saved");
} catch (error) {
console.error(error?.message ?? error?.toString()); // or however you extract your error msg
}
}
await doFile('./test.txt');
에게 은 OP 의 것을 이용한 입니다.fs기본 가져오기 저는 으로 당신의 나는 개인적으로 당신의 개별적인 기능만 가져오고 그것을 제거하기 위해 그것을 변경할 것입니다는 제거하는 .fs.esm리-흔들림조를 :
import { readFile, writeFile } from 'node:fs/promises';
const fileData = await readFile(filepath, {encoding: 'utf8'}); // fs. removed
await writeFile(ASIN + '.json', JSON.stringify(results)); // fs. removed
상세한 정보
- 문서에서:
options.encoding을 사용하여 인코딩을 지정하지 않으면 데이터가 개체로 반환됩니다.그렇지 않으면 데이터가 문자열이 됩니다.
동기화/콜백과의 대체 사용을 포함한 추가 정보는 노드 문서를 참조하십시오.Node 환경에 맞는 문서에서 올바른 버전을 선택해야 합니다.
사용하다require('fs/promises')
var fs = require('fs/promises'); // Since 11.14.0
var path = require('path'); // to help us to join better the paths
var content = JSON.stringify(["this is your content"]); // Must be a string to be written.
fs
.writeFile(path.join(__dirname, 'test.json'), content, { encoding: 'utf8' })
.then(() => {
console.log('Write is done!');
});
비동기/대기 사용 예제
var fs = require('fs/promises'); // Since 11.14.0
var path = require('path'); // to help us to join better the paths
var content = JSON.stringify(["this is your content"]); // Must be a string to be written.
(async function autorun(){
await fs.writeFile(path.join(__dirname, 'test.json'), content, { encoding: 'utf8' })
console.log('Write is done!');
})() // This is called a IIFE: Immediately invoked function expression
const util = require('util')
const fs = require('fs');
const fs_writeFile = util.promisify(fs.writeFile)
fs_writeFile('message.txt', 'Hello Node.js')
.catch((error) => {
console.log(error)
});
비동기식 변환을 사용하기 쉽도록 모든 콜백을 "파랑새"와 같은 라이브러리를 사용할 것을 약속합니다.
.then(function(results) {
fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) {
if (err) {
console.log(err);
} else {
console.log("JSON saved");
return results;
}
})
}).catch(function(err) {
console.log(err);
});
솔루션을 약속으로 시도(파랑새)
var amazon = require('amazon-product-api');
var fs = require('fs');
var Promise = require('bluebird');
var client = amazon.createClient({
awsId: "XXX",
awsSecret: "XXX",
awsTag: "888"
});
var array = fs.readFileSync('./test.txt').toString().split('\n');
Promise.map(array, function (ASIN) {
client.itemLookup({
domain: 'webservices.amazon.de',
responseGroup: 'Large',
idType: 'ASIN',
itemId: ASIN
}).then(function(results) {
fs.writeFile(ASIN + '.json', JSON.stringify(results), function(err) {
if (err) {
console.log(err);
} else {
console.log("JSON saved");
return results;
}
})
}).catch(function(err) {
console.log(err);
});
});
사용하다fs.writeFileSync아래와 같이 Try/catch 블록 내부에 있습니다.
var fs = require('fs');
try {
const file = fs.writeFileSync(ASIN + '.json', JSON.stringify(results))
console.log("JSON saved");
return results;
} catch (error) {
console.log(err);
}
언급URL : https://stackoverflow.com/questions/31978347/fs-writefile-in-a-promise-asynchronous-synchronous-stuff
'programing' 카테고리의 다른 글
| "tests' module을 잘못 가져옴"은 무엇을 의미합니까? (0) | 2023.10.06 |
|---|---|
| 런타임 오류: 예외를 만들지 못했습니다. (0) | 2023.10.06 |
| C 함수 프로토타입에 파라미터 이름을 입력하시겠습니까? (0) | 2023.10.06 |
| jQuery 키누름 화살표 키 (0) | 2023.10.06 |
| mySQL: 쿼리가 계속 로드됩니다. (0) | 2023.10.06 |