NodeJS & GCP PubSub - TypeError: PubSub не является конструктором в Object. <anonymous> - PullRequest
1 голос
/ 09 февраля 2020

Я следую учебному пособию на https://www.woolha.com/tutorials/node-js-google-cloud-pub-sub-basic-examples и испытываю некоторые трудности ..

У меня следующий код на сервере. js: -

const express = require('express');
const app = express();
const path = require('path');
const bodyParser = require('body-parser');


const dotenv = require('dotenv');
dotenv.config(); // Reads the .env file from the local folder.

// PubSub constant initialisation
const PubSub = require(`@google-cloud/pubsub`);
const pubsub = new PubSub();
const data = new Date().toString();
const dataBuffer = Buffer.from(data);
const topicName = 'sensehat-led-config';


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

// Tell the app to use the public folder.
app.use(express.static('public'));

app.get('/', (req,res) => {
    res.send('Hello from App Engine!');
})

app.get('/submit', (req, res) => {
    res.sendFile(path.join(__dirname, '/views/form.html'));
})

// Need to figure out how to get the css file to work in this.  Can't be that hard.
app.get('/sensehat', (req, res) => {
    res.sendFile(path.join(__dirname, '/views/sensehat.html'));
})


app.get('/sensehat-publish-message', (req, res) =>{
    pubsub
        .topic(topicName)
        .publisher()
        .publish(dataBuffer)
        .then(messageId => {
            console.log(`Message ${messageId} published`);
        })
        .catch(err => {
            console.error('ERROR:', err);
        });
})


app.post('/submit', (req, res) => {
    console.log({
        name: req.body.name,
        message: req.body.message
    });
res.send('Thanks for your message!');
})

// Listen to the App Engine-specified port, or 8080 otherwise
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
    console.log('Server listening on port ${PORT}...');
})

Но когда я запускаю его, я получаю '500 Server Error', и, просматривая журналы Stackdriver, я получаю следующую ошибку: -

TypeError: PubSub is not a constructor at Object.<anonymous>

Я определенно новичок ie в NodeJS и чувствую, как я обхожу вокруг. После прочтения я думаю, что проблема исходит из

const PubSub = require(`@google-cloud/pubsub`);
const pubsub = new PubSub();

строк, но не знаю, как это исправить.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

Вы можете попробовать последние версии всех библиотек. Зависимости в пакете. json

"dependencies": {
    "@google-cloud/pubsub": "1.5.0",
    "google-gax": "1.14.1",
    "googleapis": "47.0.0"
  }

Пример кода -

const {
  PubSub
} = require('@google-cloud/pubsub');

const pubsub = new PubSub({
  projectId: process.env.PROJECT_ID
});

module.exports = {
  publishToTopic: function(topicName, data) {
    return pubsub.topic(topicName).publish(Buffer.from(JSON.stringify(data)));
  },
};

Код вызывающего файла

const PubSubPublish = require('path to your above file')
let publishResult = await PubSubPublish.publishToTopic(process.env.TOPIC_NAME, data)

Надеюсь, это поможет!

0 голосов
/ 09 февраля 2020

Требуется экспорт по умолчанию @google-cloud/pubsub, но поиск не входит в экспорт по умолчанию.

Измените способ импорта PubSub на:

const {PubSub} = require(`@google-cloud/pubsub`);

Вместо этого из:

const PubSub = require(`@google-cloud/pubsub`);
...