2016-05-26 4 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, и как это, наблюдая за журналы, на обоих терминалах и слайке не отображается ошибка (это косой чертой). Я не могу найти помощь в правильном разделении функций. Как я могу назвать этот метод 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

Привет @ vitaly-t, теперь отображается ошибка 'db.map не функция '. – mfgabriel92

+0

@GabrielMFernandes, как указано в ответе: «Код основан на pg-prom 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. Добавить обработчик ошибок для обещания .
  6. Измените экспорт, чтобы db.select() - ваша функция.
  7. Пересмотренный способ, которым вы ссылались на данные в цикле for, чтобы он действительно получил требуемое свойство.
+1

Недостаточно, его метод всегда будет разрешаться с 'undefined'. –

+0

Согласно журналам Heroku, db.select не является функцией. – mfgabriel92

+0

@GabrielMFernandes - Да, вам также нужно изменить свой экспорт. так что 'db.select()' является вашей функцией. См. Мой измененный ответ. – jfriend00

0

Несколько вещей. Я бы удостоверился, что ваша функция select возвращает обещание. Я бы тоже выполнил обещание в вашем маршруте. Таким образом, вы можете правильно отправить соответствующие коды состояния и ответы.

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() называется –

Смежные вопросы