Javascript JS中的承诺:使用Axios写入mongoDB
我正努力使我的头绕过承诺。我想我理解这个概念,但我无法让他们在后端工作 我读过好几篇文章。我仍然看到一些只有几个月大的,所以我想我不是唯一一个:) 具体来说,我需要关于如何在代码中传递已解决承诺的结果的帮助。在下面的代码中,我从starwars api获取了一个JSON文件,并希望将其写入mongodb atlas集合 我使用axios.get,它返回一个承诺。然后在mongoDB集合上使用insertOne来解析它 在前端,例如在React中,它按预期工作,您可以使用setState通过使用.then函数中的setState来更改状态。 我不明白为什么它在后端不工作 你能告诉我我需要修改什么,这样我才能把它写到mongoDB atlas上吗Javascript JS中的承诺:使用Axios写入mongoDB,javascript,mongodb,promise,axios,Javascript,Mongodb,Promise,Axios,我正努力使我的头绕过承诺。我想我理解这个概念,但我无法让他们在后端工作 我读过好几篇文章。我仍然看到一些只有几个月大的,所以我想我不是唯一一个:) 具体来说,我需要关于如何在代码中传递已解决承诺的结果的帮助。在下面的代码中,我从starwars api获取了一个JSON文件,并希望将其写入mongodb atlas集合 我使用axios.get,它返回一个承诺。然后在mongoDB集合上使用insertOne来解析它 在前端,例如在React中,它按预期工作,您可以使用setState通过使用.
var axios = require("axios");
const MongoClient = require("mongodb").MongoClient;
var db;
const getData = () => {
return axios
.get("https://swapi.co/api/people/1")
.then(response => {
if (!response.data) throw Error("No data found.");
console.log(JSON.stringify(response.data)) **//This returns the data as expected.**
return JSON.stringify(response.data);
})
.catch(error => {
console.log(error);
throw error;
});
};
console.log(getData()); **// This returns {Promise <pending>}**
const client = new MongoClient(process.env.MONGODB_URL, {
useNewUrlParser: true,
useUnifiedTopology: true
});
// Connect to database and insert default users into users collection
client.connect(err => {
console.log("Connected successfully to database");
let d = {
name: "Luke Skywalker",
height: "172",
mass: "77",
hair_color: "blond",
skin_color: "fair",
eye_color: "blue"
};
db = client.db(process.env.DB_NAME);
db.collection("macroData").insertOne(d); //this works
db.collection("macroData").insertOne(getData); // this doesn't work as it still appears to be a promise
});
var-axios=require(“axios”);
const MongoClient=require(“mongodb”)。MongoClient;
var-db;
常量getData=()=>{
返回轴
.get(“https://swapi.co/api/people/1")
。然后(响应=>{
如果(!response.data)抛出错误(“找不到数据”);
console.log(JSON.stringify(response.data))**//这将按预期返回数据**
返回JSON.stringify(response.data);
})
.catch(错误=>{
console.log(错误);
投掷误差;
});
};
console.log(getData());**/这返回{Promise}**
const client=new MongoClient(process.env.MONGODB_URL{
useNewUrlParser:true,
useUnifiedTopology:正确
});
//连接到数据库并将默认用户插入用户集合
client.connect(err=>{
log(“已成功连接到数据库”);
设d={
姓名:“卢克·天行者”,
身高:“172”,
弥撒:“77”,
头发颜色:“金色”,
肤色:“白皙”,
眼睛颜色:“蓝色”
};
db=client.db(process.env.db_NAME);
db.collection(“macroData”).insertOne(d);//这很有效
db.collection(“macroData”).insertOne(getData);//这不起作用,因为它似乎仍然是一个承诺
});
getData()
返回一个承诺,正如您所知,因此您必须等待该承诺得到解决。一种简单的方法是在数据可用后执行插入:
client.connect(err=>{
// ...
getData()。然后(数据=>{
db.collection('macroData').insertOne(数据)
})
})
或者,如果可以使用异步/等待:
client.connect(异步错误=>{
// ...
常量数据=等待获取数据()
db.collection('macroData').insertOne(数据)
})
您的mongodb调用需要在axios承诺的范围内,这样就可以使用已解析的承诺为您的数据库提供数据。这就是让我耽搁了一段时间的原因
下面的代码是为Nick comment编写的,我无法在评论中发布代码,因为它太长了。您应该在这里有一个名为test的数据库或适当的名称let-datab=client.db('test')
,我认为在创建mongodb atlas时,它是默认的。
如果您在mongourl中更改了您的用户和密码,您应该可以开始了。
希望有帮助。这将在test.starWarsData下创建一个starwars条目。。希望t
let axios = require("axios");
let MongoClient = require("mongodb").MongoClient;
let mongoParams = { useNewUrlParser: true, useUnifiedTopology: true };
let mongoUrl =
"mongodb+srv://user:password@cluster0-hnc4i.azure.mongodb.net/test";
//try feeding just the object e, and see if it works, in case your axios error catching is not great.
let e = {
a: "this is a",
b: "this is b",
c: "this is c",
d: "this is d"
};
let newUrl = "https://swapi.co/api/people/1";
console.log(newUrl);
let client = new MongoClient(mongoUrl, mongoParams);
client.connect(err => {
if (err) {
console.log(err.message);
throw new Error("failed to connect");
}
let datab = client.db("test");
console.log("db connected");
try {
axios.get(newUrl).then(res => {
try {
datab.collection("starWarsData").insertOne(res.data);
console.log("insert succeeded");
} catch (err) {
console.log("insert failed");
console.log(err.message);
}
});
} catch (err) {
throw Error("axios get did not work");
}
});
工作!添加了一些try catch以查找错误,因为这使我更容易找出问题所在。更新的代码在这里<代码>获取数据(url).然后(数据=>{try{db.collection(“macroData”).insertOne(数据);console.log(“Insert-worked”);}catch{console.log(“Insert-failed”);}).catch(err=>Error(“something-breaked”)很高兴它为您解决了问题-为了简洁起见,我没有包括错误检查。显然,在插入和捕获潜在问题之前,您应该检查有效性。