2016-05-26 23 views
1

我無法要求將我的./db/index.js中的方法放入我的server.js文件中,以便從數據庫中選擇數據並顯示它。使用Node.js從其他文件調用方法

/db/index.js是這樣的:

'use strict'; 

const pgp = require('pg-promise')(); 
const pg = pgp(process.env.DATABASE_URL); 

let select =() => { 
    pg.any('SELECT username, status FROM status') 
     .then(function(data){ 
      for (var item of data) { 
       return item.username + "'s status is " + item.status; 
      } 
     }) 
     .catch(function(err) { 
      return 'Error: ' + err.message || err; 
     }); 
}; 

module.exports =() => { 
    select 
}; 

,我想它從不同的文件中稱:

'use strict'; 

const port = process.env.PORT || 3000; 
const bodyParser = require('body-parser'); 
const express = require('express'); 
const app = express(); 
const db = require('./db/'); 

app.use(bodyParser.urlencoded({extended: true})); 

app.post('/logdash', function(req, res, next) { 
    res.status(200).send(db.select()); 
}); 

app.listen(port, function() { 
    console.log('Server is running on port', port); 
}); 

我使用Heroku的,像這樣,看日誌,終端和Slack都沒有顯示錯誤(這是一個斜槓命令)。我無法找到如何正確分離功能的幫助。我怎樣才能調用這個select方法以及來自不同文件的其他方法?

回答

1

您的代碼中存在很多問題,其中一些問題在@ jfriend00的上一個答案中列出。

我只會補充說,當成功時,您也不會從方法中返回任何數據。

考慮到你得到了多少錯誤,而不是重新迭代它們,我會給你一個更正的代碼示例。

數據庫模塊:

'use strict'; 

const pgp = require('pg-promise')(); 
const db = pgp(process.env.DATABASE_URL); 

let select = (req, res, next) => 
    db.map('SELECT username, status FROM status', null, row=> { 
     return row.username + "'s status is " + row.status; 
    }) 
     .then(data=> { 
      res.status(200).send(data); 
     }) 
     .catch(err=> { 
      res.status(500).send(err.message || err); 
     }); 

module.exports = { 
    select 
}; 

和HTTP服務文件:

'use strict'; 

const port = process.env.PORT || 3000; 
const bodyParser = require('body-parser'); 
const express = require('express'); 
const app = express(); 
const db = require('./db/'); 

app.use(bodyParser.urlencoded({extended: true})); 

app.post('/logdash', db.select); 

app.listen(port, function() { 
    console.log('Server is running on port', port); 
}); 

的代碼是基於pg-promise v.4.3.x(升級,如果你有一老一)。

我不會說這是組織代碼的好方法,但至少它是一個有效的例子。您可以查看pg-promise-demo瞭解完整的應用程序示例,這可以讓您更好地瞭解如何組織數據庫代碼。


API參考:map


+0

Hi @ vitaly-t,錯誤'db.map不是函數'現在正在顯示。 – mfgabriel92

+0

@GabrielMFernandes如答案中所述,「代碼基於pg-promise v.4.3.x(升級,如果你有一個較舊的)」。 –

+0

就是這樣。像這樣,它工作得很好。我看了一下你建議我看的存儲庫,這非常有趣。謝謝。 – mfgabriel92

1

模塊中的代碼是異步的。您無法直接返回值。相反,您應該返回承諾,然後使用調用方的承諾來獲取最終的異步值。

對於這個一般概念的進一步討論,見這樣的回答:

How do I return the response from an asynchronous call?

你的代碼改成這樣(見內嵌註釋):

'use strict'; 

const pgp = require('pg-promise')(); 
const pg = pgp(process.env.DATABASE_URL); 

let select =() => { 
    // return the promise here 
    return pg.any('SELECT username, status FROM status') 
     .then(function(data){ 
      return data.map(function(item) { 
       return item.username + "'s status is " + item.status; 
      }); 
     }) 
     .catch(function(err) { 
      // to keep this an error, we have to rethrow the error, otherwise 
      // the rejection is considered "handled" and is not an error 
      throw 'Error: ' + err.message || err; 
     }); 
}; 

// export the function 
module.exports.select = select; 

,並調用它是這樣的:

'use strict'; 

const port = process.env.PORT || 3000; 
const bodyParser = require('body-parser'); 
const express = require('express'); 
const app = express(); 
const db = require('./db/'); 

app.use(bodyParser.urlencoded({extended: true})); 

app.post('/logdash', function(req, res, next) { 
    db.select().then(function(data) { 
     res.status(200).json(data); 
    }).catch(function(err) { 
     // add some sort of error response here 
     res.status(500).json(err); 
    }); 
}); 

app.listen(port, function() { 
    console.log('Server is running on port', port); 
}); 

變化概要在這裏:

  1. select(),回報承諾
  2. .catch()select(),重新拋出的錯誤,以保持它拒絕承諾。如果您爲.catch()添加處理程序並且不重新拋出或返回被拒絕的承諾,則會處理該錯誤並且承諾將被解決。
  3. 您需要修復for循環。它不應該在for循環內進行返回而不進行條件檢查。該代碼可能只是錯誤的(雖然我不知道你打算做什麼)。
  4. 當您致電db.select()時,請使用.then()處理程序來獲取最終解析值。
  5. db.select()承諾添加錯誤處理程序。
  6. 更改出口,以便db.select()是您的功能。
  7. 修改了在for循環中引用數據的方式,以便實際獲取所需的屬性。
+1

這是不夠的,他的方法總是會用'undefined'來解決。 –

+0

根據Heroku的日誌,db.select不是一個函數。 – mfgabriel92

+0

@GabrielMFernandes - 是的,你也必須改變你的出口。所以'db.select()'是你的函數。看到我修改後的答案。 – jfriend00

0

有幾件事情。我會確保你的select函數返回一個Promise。我也會處理你的路線中的承諾。這樣你可以正確地發送適當的狀態碼和響應。

db/index.js

'use strict'; 

const pgp = require('pg-promise')(); 
const pg = pgp(process.env.DATABASE_URL); 

let select =() => { 
    return pg.any('SELECT username, status FROM status') 
} 

module.exports =() => { 
    select 
}; 

server.js

'use strict'; 

const port = process.env.PORT || 3000; 
const bodyParser = require('body-parser'); 
const express = require('express'); 
const app = express(); 
const db = require('./db/'); 

app.use(bodyParser.urlencoded({extended: true})); 

app.post('/logdash', function(req, res, next) { 
    db.select() 
     .then((data) => { 
      res.status(200).json(data) 
     }) 
     .catch((error) => { 
      res.status(500).json(error) 
     }) 
}); 

app.listen(port, function() { 
    console.log('Server is running on port', port); 
}); 

我沒有測試這一點,但它應該做的伎倆。

+0

它缺少映射邏輯;) –

+0

出口沒有問題。你導出一個函數,但從來沒有調用它。 – jfriend00

+0

@ jfriend00 db.select()被稱爲 –