簡體   English   中英

如何調試不會從MongoDB檢索數據的JavaScript?

[英]How to debug JavaScript that won't retrieve data from MongoDB?

我正在關注本教程: https : //anmolkoul.wordpress.com/2015/06/05/interactive-data-visualization-using-d3-js-dc-js-nodejs-and-mongodb/

解決了一些問題之后,一切似乎都可以正常工作,但是該頁面未顯示MongoDB中的數據。 似乎正在嘗試連接,但始終最終會失敗。

我什至把我的Mongo集合放到mLab上,看看它是否可以連接到本地主機以外的其他地方。 它不是。

我有一個Server.js文件

// modules =================================================
var express        = require('express');
var app            = express();
var mongoose       = require('mongoose');
var bodyParser     = require('body-parser');
var methodOverride = require('method-override');

// configuration ===========================================

// config files
var port = process.env.PORT || 8080; // set our port
var db = require('./config/db');

// connect to our mongoDB database (commented out after you enter in your own credentials)
connectionsubject = mongoose.createConnection(db.urlSubjectViews);



// get all data/stuff of the body (POST) parameters
app.use(bodyParser.json()); // parse application/json 
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json
app.use(bodyParser.urlencoded({ extended: true })); // parse application/x-www-form-urlencoded

app.use(methodOverride('X-HTTP-Method-Override')); // override with the X-HTTP-Method-Override header in the request. simulate DELETE/PUT
app.use(express.static(__dirname + '/public')); // set the static files location /public/img will be /img for users

// routes ==================================================
require('./app/routes')(app); // pass our application into our routes

// start app ===============================================
app.listen(port);   
console.log('Magic happens on port ' + port);           // shoutout to the user
exports = module.exports = app;                         // expose app

指向數據庫的db.js文件:

    module.exports = {
    urlSubjectViews: 'mongodb://localhost:27017/donorschoose',

}

一個SubjectViews.js文件,指向我需要的數據

// define our nerd model
// module.exports allows us to pass this to other files when it is called
module.exports = connectionsubject.model('', {}, 'projects');

還有一個Route.js文件,用於為JSON數據設置路由

var Subjects = require('./models/SubjectViews');

module.exports = function(app) {

    // server routes ===========================================================
    // handle things like api calls
    // authentication routes    
    // sample api route
 app.get('/api/data', function(req, res) {
  // use mongoose to get all nerds in the database
  Subjects.find({}, {'_id': 0, 'school_state': 1, 'resource_type': 1, 'poverty_level': 1, 'date_posted': 1, 'total_donations': 1, 'funding_status': 1, 'grade_level': 1}, function(err, subjectDetails) {
   // if there is an error retrieving, send the error. 
       // nothing after res.send(err) will execute
   if (err) 
   res.send(err);
    res.json(subjectDetails); // return all nerds in JSON format
  });
 });





 // frontend routes =========================================================
 app.get('*', function(req, res) {
  res.sendfile('./public/index.html');
 });
}

這是我在Studio 3T中的收藏Mongo收藏

我知道它指向數據庫,因為當我查看localhost:8080 / api / data時,頁面顯示自身正在加載,但過一會兒就會超時。 好像是我遇到這個問題??

在這種情況下,更普遍的問題是您遵循的是3年的教程,該教程基於一個不能像宣傳的那樣工作的軟件包(至少對我而言不再有用了)。

opc: git clone https://github.com/anmolkoul/node-dc-mongo.git
Cloning into 'node-dc-mongo'...
remote: Counting objects: 930, done.
remote: Total 930 (delta 0), reused 0 (delta 0), pack-reused 930
Receiving objects: 100% (930/930), 1.75 MiB | 0 bytes/s, done.
Resolving deltas: 100% (133/133), done.
opc: cd node-dc-mongo/
node-dc-mongo>: rm -rf node_modules/
node-dc-mongo>: npm install
npm WARN deprecated mongodb@1.4.38: Please upgrade to 2.2.19 or higher

> bson@0.2.22 install /Users/lineus/dev/opc/node-dc-mongo/node_modules/bson
> (node-gyp rebuild 2> builderror.log) || (exit 0)

  CXX(target) Release/obj.target/bson/ext/bson.o

> kerberos@0.0.11 install /Users/lineus/dev/opc/node-dc-mongo/node_modules/kerberos
> (node-gyp rebuild 2> builderror.log) || (exit 0)

  CXX(target) Release/obj.target/kerberos/lib/kerberos.o
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN starter-node-angular@1.0.1 No repository field.
npm WARN starter-node-angular@1.0.1 No license field.

added 64 packages in 8.994s
node-dc-mongo>: node server.js 
{ Error: Cannot find module '../build/Release/bson'
    at Function.Module._resolveFilename (module.js:538:15)
    at Function.Module._load (module.js:468:25)
    at Module.require (module.js:587:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/lineus/dev/opc/node-dc-mongo/node_modules/bson/ext/index.js:15:10)
    at Module._compile (module.js:643:30)
    at Object.Module._extensions..js (module.js:654:10)
    at Module.load (module.js:556:32)
    at tryModuleLoad (module.js:499:12)
    at Function.Module._load (module.js:491:3) code: 'MODULE_NOT_FOUND' }
js-bson: Failed to load c++ bson extension, using pure JS version
Magic happens on port 8080
^C
node-dc-mongo>: 

因此,要使其順利進行將需要一些工作。

讓我們首先通過創建一個模仿您代碼中貓鼬位的獨立文件來稍微簡化問題空間,以便於進行推理。 (我使用的是Mongoose的較新版本,但細節相同)。

'use strict'

const mongoose = require('mongoose')
const conn = mongoose.createConnection('mongodb://localhost/test')

const Model = conn.model('', {}, 'tests')

Model.find({}, (err, docs) => {
  if (err) { return console.error(err) }
  console.log(`there are ${docs.length} docs in this collection.`)
  return conn.close()
})

如果我們運行此代碼,將沒有輸出,並且一切似乎都卡住了。

49715319: node ./connect.js
^C
49715319:

createConnection方法返回一個從eventEmitter繼承的連接對象。 為了成功使用返回的連接對象,我們必須“監聽”“打開”事件。

我們可以這樣更改文件:

'use strict'

const mongoose = require('mongoose')
const conn = mongoose.createConnection('mongodb://localhost:27017/test')

const Model = conn.model('', {}, 'tests')

conn.on('open', function (err) {
  if (err) { return console.error(err) }
  Model.find({}, (err, docs) => {
    if (err) { return console.error(err) }
    console.log(`there are ${docs.length} docs in this collection.`)
    return conn.close()
  })
})

輸出變為:

49715319: node ./connect.js
there are 1000 docs in this collection.
49715319:

這意味着您應該像這樣更改server.js文件

// modules =================================================
var express = require('express');
var app = express();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');

// configuration ===========================================

// config files
var port = process.env.PORT || 8080; // set our port
var db = require('./config/db');

// connect to our mongoDB database (commented out after you enter in your own credentials)
connectionsubject = mongoose.createConnection(db.urlSubjectViews);


connectionsubject.on('open', function (err) {
  if (err) { return console.error(err) }
  // get all data/stuff of the body (POST) parameters
  app.use(bodyParser.json()); // parse application/json
  app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json
  app.use(bodyParser.urlencoded({ extended: true })); // parse application/x-www-form-urlencoded

  app.use(methodOverride('X-HTTP-Method-Override')); // override with the X-HTTP-Method-Override header in the request. simulate DELETE/PUT
  app.use(express.static(__dirname + '/public')); // set the static files location /public/img will be /img for users

  // routes ==================================================
  require('./app/routes')(app); // pass our application into our routes

  // start app ===============================================
  app.listen(port);
  console.log('Magic happens on port ' + port);           // shoutout to the user
  exports = module.exports = app;                         // expose app
})

在Mongoose成功連接到服務器之前,這不會啟動Express應用程序。

考慮到您使用的Mongoose版本,它也可能仍然無法使用。 如果仍然失敗,我建議在撰寫本文時安裝最新版本的Mongoose或至少最新版本的Mongoose 4。

為了完整起見,這就是我為此測試集合(使用Mongoose 5)生成文檔的方式:

#!/usr/bin/env node
'use strict'

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/test')
const Schema = mongoose.Schema

const schema = new Schema({
  name: String
})

const Test = mongoose.model('test', schema)

const tests = []

for (let i = 0; i < 1000; i++) {
  tests.push(new Test({ name: `testing${i}` }))
}

async function run () {
  await mongoose.connection.dropDatabase()
  let docs = await Test.create(tests)
  console.log(`added ${docs.length} docs to ${Test.modelName}`)
  return mongoose.connection.close()
}

run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM