Webtask.io не может найти модуль

Я изучаю серверный бэкэнд и пытаюсь webtask.io развернуть простой бэкэнд для получения цен от бирж криптовалюты. Мой сервер работает нормально, когда я развертываю его локально, но когда я пытаюсь развернуть его в webtask.io, я получаю эту ошибку Cannot find module './server/routes/api',

Вы можете проверить ошибку здесь:

Ссылка на ошибку WT

это мой код

index.js

var Express = require('express');
var Webtask = require('webtask-tools');
var bodyParser = require('body-parser')
const app = Express();
const api = require('./server/routes/api');

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.use(express.static(path.join(__dirname, 'dist')));

// Set our api routes
app.use('/api', api);

// Catch all other routes and return the index file
app.get((req, res, next) => {
  res.sendFile(path.join(__dirname, 'dist/index.html'));
});

module.exports = Webtask.fromExpress(app);

api.js

const express = require('express');
const router = express.Router();

// declare axios for making http requests
const axios = require('axios');
const coinTicker = require('coin-ticker');

/* GET api listing. */
router.get('/', (req, res, next) => {
  res.send('api works');
});

router.get('/clpbtc', function(req, res, next) {
  axios.get('https://www.surbtc.com/api/v2/markets/btc-clp/ticker')
  .then(response => {
    res.status(200).json(response.data);
  })
  .catch(error => {
    console.log(error);
  });
});

router.get('/ethbtc', function(req, res, next) {
  coinTicker('bittrex', 'ETH_BTC')
    .then(posts => {
      res.status(200).json(posts.bid);
    })
    .catch(error => {
      res.status(500).send(error);
    });
});

router.get('/ltcbtc', function(req, res, next) {
  coinTicker('bittrex', 'LTC_BTC')
    .then(posts => {
      res.status(200).json(posts.bid);
    })
    .catch(error => {
      res.status(500).send(error);
    });
});

router.get('/xrpbtc', function(req, res, next) {
  coinTicker('bittrex', 'XRP_BTC')
    .then(posts => {
      res.status(200).json(posts.bid);
    })
    .catch(error => {
      res.status(500).send(error);
    });
});

router.get('/zecbtc', function(req, res, next) {
  coinTicker('bittrex', 'ZEC_BTC')
    .then(posts => {
      res.status(200).json(posts.bid);
    })
    .catch(error => {
      res.status(500).send(error);
    });
});

router.get('/timer', function(req, res, next) {
  setInterval(function () {
    console.log("Hello");
}, 5000);
})

module.exports = router;

Спасибо за вашу помощь, как всегда!

2 ответа

Мне было трудно найти решение этой проблемы, потому что оно не очень хорошо задокументировано в документах Webtask.

Ключом к решению этой проблемы является использование --bundle флаг в мас-кли

пример

файлfaucet.js

const bitgoHandler = require('./functions/bitgoHandler')
const to = require('await-to-js').default

module.exports = faucet

async function faucet ({body, data}, cb) {
  const [err, result] = await to(bitgoHandler.sendTransaction(body, data))
  if (err) return cb(err)
  cb(null, result)
}

файлbitgoHandler.js

const BitGoJS = require('bitgo'); 
const to = require('await-to-js').default

module.exports = {   getWallet,   sendTransaction }

function getWallet (accessToken, faucetWalletId) {   
 const bitgo = new BitGoJS.BitGo({ env: 'test', accessToken });   
 const coin = bitgo.coin('tbtc');   
 return coin.wallets().get({id: faucetWalletId}) 
}

async function sendTransaction ({receiverAddress}, {ACCESS_TOKEN, FAUCET_WALLET_ID, WALLET_PASSPHRASE}) {   const [err, wallet] = await to(getWallet(ACCESS_TOKEN, FAUCET_WALLET_ID))   if (err) return Promise.reject(err)   
let params = {
    amount: 0.01 * 1e8,
    address: receiverAddress,
    walletPassphrase: WALLET_PASSPHRASE   
};   
return wallet.send(params) 
}

Для развертывания всего приложения я использовал скрипт ниже

wt create -s ACCESS_TOKEN=<ACCESS_TOKEN> -s FAUCET_WALLET_ID=<FAUCET> -s WALLET_PASSPHRASE=<WALLET> --bundle faucet.js

Просто используйте --bundle аргумент.

wt create --bundle index.js

Источник: Webtask Docs

Другие вопросы по тегам