iT邦幫忙

0

[已解決]JS 裡儲存mongoDB find()後的資料

如題,
目前想讓MongoDB find後的資料先暫時存在一個變數當中,
之後再結合其他find到的資料在一起 res.json(documents); 到前端顯示,
以下是目前程式碼

app.js

var temp = {};
temp = JSON.parse( db.getDB().collection(collection).find({pname: "bag" }) );
console.log(temp);

但是都會有以下的錯誤

SyntaxError: Unexpected token o in JSON at position 1

懇請各位大大解答,感謝

看更多先前的討論...收起先前的討論...
dragonH iT邦超人 5 級 ‧ 2019-08-04 18:37:05 檢舉
因為你要轉的不是 string

然後我也好奇

就算真的可以轉

你確定他會等你 query 完 database 拿到結果才轉嗎
p39212053 iT邦新手 4 級 ‧ 2019-08-04 18:47:52 檢舉
我剛發現他一樣會....有非同步的問題 QQ.....
dragonH iT邦超人 5 級 ‧ 2019-08-04 18:50:28 檢舉
☜(゚ヮ゚☜)
p39212053 iT邦新手 4 級 ‧ 2019-08-04 19:07:42 檢舉
dragonH大神表情也太可愛XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
dragonH
iT邦超人 5 級 ‧ 2019-08-04 18:53:39
最佳解答
const Express = require('express');
const axios = require('axios');
const cheerio = require('cheerio');
const app = Express();
// const monk = require('monk');
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017';
const dbName = 'demo';
const router = Express.Router();
const port = 9999;
//const db = monk('127.0.0.1:27017/demo');
let db = null;
MongoClient.connect(url, async (err,client) => {
  if (err) {
    console.log(err);
  }
  db = await client.db(dbName);
  console.log('Database connected');
});

router.get('/', async (req, res) => {
  const mycollection = db.collection('demo1');
  const result = await mycollection.find({}).toArray();
  res.status(200).send({ result }).end();
});

連 db 是我亂寫的

僅供參考

反正可以 demo 連就好 XD

我比較常用 monk /images/emoticon/emoticon11.gif

這種基本上就是要用 promise

或者你要自己寫成 callback

看更多先前的回應...收起先前的回應...
p39212053 iT邦新手 4 級 ‧ 2019-08-04 19:20:14 檢舉

因為趕著在後天寫出一個專案,所以想說下一次寫專案的時候再使用monk ,大神抱歉(つд⊂)

剛改了code但還是會有非同步問題 QQ...

app.js

//store errorQ
const errorQ = (errQ) => {
  return new Promise((resolve, reject) => {
    let i = 0;
    let temp = {};
    for(i = 0; i < errQ["errQ"].length; i++){
      db.getDB().collection(collection).find({pname: errQ["errQ"][i] }).toArray(
        function(err, result) {
          if (err) throw err;
          console.log(result);
          // console.log(typeof(result)); //object
          console.log("1");
          temp += JSON.stringify(result);
        }
      );
      console.log("2temp"+temp);
    }//end for
    console.log("3"+temp);
    resolve(temp).catch(err => reject(err));
      
  });
};

// read db content for Personally examination
app.post('/getPersonallyQuestion', async (req,res,next)=>{
  const errQ = req.body;
  console.log(errQ["errQ"][0]);
  console.log(errQ["errQ"].length);
  const temp = await errorQ(errQ)
    .then(temp => temp)
    .catch(err => res.status(500).send({ message: err }).end());

  console.log(temp+"INNNNNNNNNNNNNNNNNNNNNNNNNN");

});

這是errQ裡面的內容
https://ithelp.ithome.com.tw/upload/images/20190804/20111873oJ3IaW70gy.jpg

希望大大能解答 (´・ω・;`)

dragonH iT邦超人 5 級 ‧ 2019-08-04 19:35:49 檢舉

我沒有要逼你用 monk 啦 XD

我只是怕我不熟可能舉的例子會不好/images/emoticon/emoticon01.gif

你這樣試試看

const errorQ = (errQ) => {
  return new Promise((resolve, reject) => {
    let temp = {};
    for (let i = 0; i < errQ['errQ'].length; i += 1) {
      db.getDB().collection(collection).find({ pname: errQ.errQ[i] }).toArray((err, result) => {
        if (err) {
          reject(err);
          return false;
        }
        temp += JSON.stringify(result);
      });
    }
    resolve(temp);
  });
};
p39212053 iT邦新手 4 級 ‧ 2019-08-04 19:46:04 檢舉

他回傳還是空的 (´・ω・;`)

[object Object]
dragonH iT邦超人 5 級 ‧ 2019-08-04 19:52:31 檢舉

你傳進去的 errQ

是長這樣

['snack', 'bag', 'panda']

還是

{
    errQ: ['snack', 'bag', 'panda']
}

你的 console.log(errQ.errQ) 有東西嗎

p39212053 iT邦新手 4 級 ‧ 2019-08-04 19:58:07 檢舉

https://ithelp.ithome.com.tw/upload/images/20190804/20111873Sx8tPKBsUI.jpg
剛剛用上圖測試,但是顯示下圖
https://ithelp.ithome.com.tw/upload/images/20190804/20111873xnSiTz6YVs.jpg

應該是長 ['snack', 'bag', 'panda']

dragonH iT邦超人 5 級 ‧ 2019-08-04 20:08:56 檢舉

沒喔

你這樣是長

const errQ = {
    errQ: ['snack', 'bag', 'panda']
}

換成這樣應該就可以了

const errorQ = (errQ) => {
  return new Promise(async (resolve, reject) => {
    let temp = {};
    for (let i = 0; i < errQ.errQ.length; i += 1) {
      const result = await db.getDB().collection(collection).find({ pname: errQ.errQ[i] }).toArray();
      temp += JSON.stringify(result);
    }
    resolve(temp);
  });
};
p39212053 iT邦新手 4 級 ‧ 2019-08-04 20:39:01 檢舉

感謝 dragonH 大大 (o´・ω・`)ノ

dragonH iT邦超人 5 級 ‧ 2019-08-04 20:46:26 檢舉

/images/emoticon/emoticon82.gif

我要發表回答

立即登入回答