por qué este InsertToDataBase.insertdatatolamp0(1,1); inserte el elemento en la base de datos pero el primero InsertToDataBase.insertdatatolamp0(0,0); No.
por favor alguna solución para ejecutar InsertToDataBase.insertdatatolamp0(0,0);
principal.js
const axios = require('axios') const InsertToDataBase = require("./InsertToDataBase"); const username = 'admin' const password = 'admin' const token = Buffer.from(`${username}:${password}`, 'utf8').toString('base64') const urlLAMP_0 = 'http://127.0.0.1:8282/~/mn-cse/mn-name/LAMP_0/DATA/la' function getDataLAMP_0(){ axios.get(urlLAMP_0, { headers: { 'Authorization': `Basic ${token}`, 'Accept': 'application/json', 'mode': 'cors', 'credentials': 'include', } }) .then(function(response) { document.getElementById("rn0").textContent = response.data['m2m:cin'].rn; document.getElementById("ty0").textContent = response.data['m2m:cin'].ty; }) .then((response) => { var rn0 = response.data["m2m:cin"].rn; var ty0 = response.data["m2m:cin"].ty; InsertToDataBase.insertdatatolamp0(0,0); }); } InsertToDataBase.insertdatatolamp0(1,1); getDataLAMP_0();Insertar en la base de datos.js
const {Client} = require('pg') const client = new Client({ user:"postgres", password:"admin", host:"localhost", port:"5432", database:"postgres", }) function insertdatatolamp0(rn0,ty0){ client.connect() .then(()=>console.log("connected successfuly")) .then(()=>client.query("insert into lamp0 values ($1,$2)",[rn0,ty0])) .catch(e=> console.log(e)) .finally(()=> client.end()) } module.exports = { insertdatatolamp0 };En una cadena de promesa, cada paso espera que el paso anterior devuelva el resultado.
En su cadena de promesas, este paso:
.then(function(response) { document.getElementById("rn0").textContent = response.data['m2m:cin'].rn; document.getElementById("ty0").textContent = response.data['m2m:cin'].ty; }) no devuelve nada, lo que significa que devuelve undefined . Por lo tanto, el siguiente paso en la cadena obtiene esa respuesta:
.then((response) => { // response here is undefined var rn0 = response.data["m2m:cin"].rn; var ty0 = response.data["m2m:cin"].ty; InsertToDataBase.insertdatatolamp0(0,0); });Para que funcione como se espera, cambie el paso anterior a:
.then(function(response) { document.getElementById("rn0").textContent = response.data['m2m:cin'].rn; document.getElementById("ty0").textContent = response.data['m2m:cin'].ty; return response; }) Nota al margen: aunque InsertToDataBase.insertdatatolamp0(0,0); está más arriba en el código, no debe referirse a él como "el primero" . Debido a que está envuelto en una Promise() , en realidad se ejecutará más tarde, cuando se resuelva la promesa. Mientras que InsertToDataBase.insertdatatolamp0(1,1); será el primero que se ejecute.
¿Ves el resultado de tu llamada?
axios.get(urlLAMP_0, { headers: { 'Authorization': `Basic ${token}`, 'Accept': 'application/json', 'mode': 'cors', 'credentials': 'include', } })en la pestaña Redes de su navegador?
La cadena .then() funciona solo si su promesa inicial tiene éxito. Si sus solicitudes se bloquean mientras están en estado de espera o fallan, la cadena nunca continúa.
Además, hay un problema más adelante en su cadena.
.then(function(response) { document.getElementById("rn0").textContent = response.data['m2m:cin'].rn; document.getElementById("ty0").textContent = response.data['m2m:cin'].ty; }) .then((response) => { var rn0 = response.data["m2m:cin"].rn; var ty0 = response.data["m2m:cin"].ty; InsertToDataBase.insertdatatolamp0(0,0); }); La response en la primera función es el resultado de la promesa axios.get(). Pero como su primer .then() no devuelve nada (debería devolver una promesa o algún valor), se trata como su función que devuelve undefined de forma predeterminada, por lo que el segundo .then(response => ...) obtendrá una respuesta indefinida.
Tienes dos opciones.
response como resultado de su primer .then() o2 es más limpio y mejor, debe usar varios .then() si solo devuelve Promise en cada uno de ellos para avanzar o necesita alguna condición, como:
return axios.get(something) .then(response => { if (response.a) return axios.get(somethingElse) else return response }) .then(response => { // here we have either initial response or response from the next get })Eso no está relacionado directamente con su pregunta, pero es un error.
En este momento, está "encadenando" la inserción de los datos usando una serie de declaraciones .then() .
Sin embargo, no está pasando la respuesta a través de esta cadena de llamadas .then , lo que podría ser su problema.
Al escribir promesas en Javascript, también debe tratar de manejar sus errores. Eso le dará más información sobre lo que podría estar saliendo mal, de lo contrario, Javascript generará un error de excepción no detectado y será difícil de depurar.
He agregado algunas líneas de código a su archivo main.js , que con suerte lo orientarán en la dirección correcta.
const axios = require('axios') const InsertToDataBase = require("./InsertToDataBase"); const username = 'admin' const password = 'admin' const token = Buffer.from(`${username}:${password}`, 'utf8').toString('base64') const urlLAMP_0 = 'http://127.0.0.1:8282/~/mn-cse/mn-name/LAMP_0/DATA/la' function getDataLAMP_0(){ axios.get(urlLAMP_0, { headers: { 'Authorization': `Basic ${token}`, 'Accept': 'application/json', 'mode': 'cors', 'credentials': 'include', } }) .then(function(response) { document.getElementById("rn0").textContent = response.data['m2m:cin'].rn; document.getElementById("ty0").textContent = response.data['m2m:cin'].ty; return response; // You must return the response here.... }) .then((response) => { // In order to get access to it here... // If you try to access response.data (where response === undefined) you will get an error! That may be happening, but you weren't handling the error. var rn0 = response.data["m2m:cin"].rn; var ty0 = response.data["m2m:cin"].ty; return InsertToDataBase.insertdatatolamp0(0,0); }) .then(() => { console.log("SUCCESS"); }) .catch((err) => { // And handle your error case! console.error(err); }); } getDataLAMP_0();