iT邦幫忙

1

node express模型下如何從app.js藉由router傳值到index.ejs?

  • 分享至 

  • xImage

目前架構:
https://ithelp.ithome.com.tw/upload/images/20190813/20110934sp5CSVk6dG.png

app.js

function handleMessage(sender_psid, received_message) {
...
}
...
var indexRouter = require('./routes/index');
app.use('/', indexRouter);

routes/index.js

router.get('/', function(req, res, next) {
  // res.render('index', { title: 'Express' });
  res.render('chat');
});

chat.ejs

<script>
function insertChat(who, text, time) {
...
}
...
insertChat("me", "Hello Tom...", 0);
</script>

我想將app.js中的'received_message'傳值進insertChat的"Hello Tom..."的位置
但卻不知道應該透過什麼方法來傳值和呼叫function?
希望大大們可以給一點建議,謝謝!

fillano iT邦超人 1 級 ‧ 2019-08-13 15:43:43 檢舉
你知道哪些程式在後端執行,哪些在瀏覽器執行嗎?如果要做的是chat,考慮同時使用 https://socket.io/
Huiicat iT邦新手 4 級 ‧ 2019-08-14 04:12:37 檢舉
感謝回覆~
我大致上知道,不過目前想先將接收訊息與回傳訊息這部分解決…
中間有透過FB的messenger,主要是另外有使用語音辨識的套件,所以才沒有打算另寫伺服器~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
dragonH
iT邦超人 5 級 ‧ 2019-08-13 15:43:40

app.js

const Express = require('express');
const path = require('path');
const app = Express();
const indexRouter = require('./routes');
const port = 8888;
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 

function handleMessage(sender_psid, received_message) {
  return 'Tom';
}
app.use((req, res, next) => {
  req.myData = handleMessage('123', '456');
  next();
});
app.use(indexRouter);
app.listen(port, () => {
  console.log(`Server is running on http://127.0.0.1:${port}`);
});

routes/index.js

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

router.get('/', (req, res) => {
  console.log(req.myData);
  res.render('chat',{ title: 'Demo', msg: `Hello ${req.myData}` },); 
});

module.exports = router;

chat.ejs

<!DOCTYPE html> 
<html> 
<head> 
<title><%= title %></title> 
</head> 
<body> 
<h1><%= title %></h1> 
<p>Welcome to <%= title %></p> 
</body> 
<script>
  function insertChat(who, text, time) {
  }
  insertChat("me", "<%= msg %>", 0);
</script>
</html> 

result

https://ithelp.ithome.com.tw/upload/images/20190813/20117259wgogM2RmFU.png

這樣嗎?

看更多先前的回應...收起先前的回應...
Huiicat iT邦新手 4 級 ‧ 2019-08-14 03:57:29 檢舉

不好意思,我的意思是 假設使用者傳「哈囉你好嗎」會賦值給received_message,然後我想將「哈囉你好嗎」取代「hello Tom...」insertChat到網頁上~

fillano iT邦超人 1 級 ‧ 2019-08-14 09:06:04 檢舉

所以?你是透過後台接fb還是前台?

dragonH iT邦超人 5 級 ‧ 2019-08-14 09:28:46 檢舉

一樣的做法呀
app.js

...
function handleMessage(sender_psid, received_message) {
  return received_message;
}
app.use((req, res, next) => {
  const { sender_psid, received_message } = req.query;
  req.myData = handleMessage(sender_psid, received_message);
  next();
});
...

routes/index.js

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

router.get('/', (req, res) => {
  console.log(req.myData);
  res.render('chat',{ title: 'Demo', msg: req.myData },); 
});

module.exports = router;

輸入網址

http://127.0.0.1:8888/?sender_psid=00001&received_message=hello%20itehelp

result
https://ithelp.ithome.com.tw/upload/images/20190814/20117259aQYn5NXVfS.png

我是不太知道你整個想要的效果是什麼

不過通常 chat 都會建議用 websocket 做

fillano iT邦超人 1 級 ‧ 2019-08-14 09:48:19 檢舉

XD

我是想問他,如果是接fb的messenger api,那會透過後台傳接訊息嗎?即使是透過後台,也應該是用ajax的方式,而不是靜態render view。

dragonH iT邦超人 5 級 ‧ 2019-08-14 09:51:57 檢舉

對呀

而且感覺不論他是用哪種

都應該不會是用他問的這種靜態產生 view

/images/emoticon/emoticon07.gif

Huiicat iT邦新手 4 級 ‧ 2019-08-14 10:51:13 檢舉

我是透過後台接,原本只是純粹處理messenger的訊息後再丟回去。但現在被要求要額外架一個網頁chat。於是我想將本來在後台處理的訊息直接丟到網頁chat的殼去這樣。
實屬會的東西有限,還有時間有限,所以不敢改太多東西><""

Huiicat iT邦新手 4 級 ‧ 2019-08-14 11:02:58 檢舉

不過你們說的對,還是只能用websocket才行QQ

Huiicat iT邦新手 4 級 ‧ 2019-08-14 11:29:44 檢舉

不過我只想一個user對一個聊天機器人…這樣還是用socket嗎?

Huiicat iT邦新手 4 級 ‧ 2019-08-14 11:29:44 檢舉

不過我只想一個user對一個聊天機器人…這樣還是用socket嗎?

dragonH iT邦超人 5 級 ‧ 2019-08-14 11:32:58 檢舉

用 websocket 的最主要的目的

是因為它可以達到幾乎及時的效果

人數那些應該屬於你 backend 的 邏輯

不是 websocket 會 care 的點 (一般情況下

Huiicat iT邦新手 4 級 ‧ 2019-08-14 11:59:21 檢舉

因為主要是想做chatbot,但是是網頁版形式的這樣
我希望每個人進來只看到bot本人,而不想大家都在一個聊天室裡面…

dragonH iT邦超人 5 級 ‧ 2019-08-14 13:23:41 檢舉

websocket 我記得可以取得 userID

backend 再針對 id 送個別的資料

我要發表回答

立即登入回答