我这里有这个功能:
function createInsta(email, userid) {
if (!fs.existsSync('users/' + email + '/' + userid)) {
fs.mkdir('users/' + email + '/' + userid)
fs.writeFileSync(('users/' + email + '/' + userid + '/instagram.json'), fs.readFileSync("data/data.json", "utf-8"))
console.log("insta folder created");
}
console.log("Initializing Data")
var data = fs.readFileSync('users/' + email + '/' + userid + '/instagram.json', "utf-8")
data = JSON.parse(data);
var result;
request(("https://instagram.com/" + userid + "/?__a=1"), function(error, response, body) {
var res = JSON.parse(body);
result = res.user.followed_by.count
if (error) {
console.log(err)
}
})
while (result === undefined) {
deasync.sleep(100)
}
data.STARTING_COUNTS[0].DAY = result;
data.STARTING_COUNTS[0].WEEK = result;
data.STARTING_COUNTS[0].MONTH = result;
}
在控制台打印出 Initializing Data
后,控制台显示 Segmentation fault
我不知道这是为什么,我的代码似乎没有任何东西会导致这样的错误。
有什么指点吗?谢谢
最佳答案
正如所 promise 的(请原谅双关语),这里开始将您的代码转换为 Promise/await。
这是让您的代码开始使用 promises 的开始,需要更多的错误检查等,但我现在故意对代码做的很少以显示更改,我们可以在继续进行重构.
例如。所有 fs.existsSync 等,都希望成为 promise ,这样我们就可以摆脱所有同步的东西。您的 node.js 应用程序会因此而爱上您。
稍后,我们可以做更多。浏览器/Node 中内置的 Promise 很好,但我也发现 Promise 库可以使事情变得更容易,我建议 bluebird -> http://bluebirdjs.com/docs/getting-started.html那里也值得好好读一读,bluebird 有一些有用的实用函数,比如 promisify,可以让你的 fs.func 更容易。
所以我认为现在应该这样做,稍后我们将进行另一次重构。
//lets mark this function as async..
async function createInsta(email, userid) {
return new Promise(function (resolve, reject) {
if (!fs.existsSync('users/' + email + '/' + userid)) {
fs.mkdir('users/' + email + '/' + userid)
fs.writeFileSync(('users/' + email + '/' + userid + '/instagram.json'), fs.readFileSync("data/data.json", "utf-8"))
console.log("insta folder created");
}
console.log("Initializing Data")
var data = fs.readFileSync('users/' + email + '/' + userid + '/instagram.json', "utf-8")
data = JSON.parse(data);
request(("https://instagram.com/" + userid + "/?__a=1"), function(error, response, body) {
if (error) {
console.log(err)
return reject(error);
}
var res = JSON.parse(body);
var result = res.user.followed_by.count
data.STARTING_COUNTS[0].DAY = result;
data.STARTING_COUNTS[0].WEEK = result;
data.STARTING_COUNTS[0].MONTH = result;
resolve(data); //i'm assuming data is what your wanting to return
})
});
}
//to be able to use await our function also needs to be async
async function run() {
var data = await createInsta('bob@bob.com');
}
关于javascript - 为什么我在 Node.js 中出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40118215/