Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ExpressJS公共文件部署后不提供服务(NodeJS/Express)_Javascript_Node.js_Express_Static Files - Fatal编程技术网

Javascript ExpressJS公共文件部署后不提供服务(NodeJS/Express)

Javascript ExpressJS公共文件部署后不提供服务(NodeJS/Express),javascript,node.js,express,static-files,Javascript,Node.js,Express,Static Files,项目目录结构如下: my_project server.js app.js | | - public | ----------| images | javascripts | stylesheets | -------------- imgs ---scripts.js ---styles.css | | - routes | | - views | ----------| partials | ---------

项目目录结构如下:

my_project
server.js
app.js
|
| - public
|           ----------| images | javascripts | stylesheets
|           -------------- imgs ---scripts.js ---styles.css 
|
| - routes
|
| - views
|           ----------| partials
|           -------------- header.ejs, searchbar.ejs, footer.ejs
| (rendered views.ejs)
|
| 
| misc. files
在我的header.ejs文件中,这是指向我的.css文件的路径,该文件位于public/stylesheets/style.css
href='/stylesheets/style.css'

在我的app.js文件中,下面是我告诉express为公共目录服务的代码:
app.use(express.static(path.join(u dirname,'public'))。此外,我还尝试过:
app.use(express.static(“/public”)但没有任何运气

目前,JS和CSS文件都可以在本地提供,但是当我部署这个应用程序时(我无法控制根目录或结构),它不会提供文件

这就是我不确定如何处理的问题——在本地,在
href='/stylesheets/style.css'
前面放置
'/'
非常有效,但我知道一旦部署,它将搜索域的路径,当然不会出现。但是,如果我删除
“/”
,它将在本地停止工作,但在部署后可能会正确地提供文件


如何解决此问题?如有任何建议,将不胜感激

我找到了解决问题的办法。对于遇到相同问题的未来搜索者,请尝试设置一个动态路径变量,通过每个路径进行渲染。例如:

Myheader.ejs文件包含指向.css文件的以下链接:

然后,您可以通过相应的路由器将特定路径传递到所需的view.ejs。例如,我的index.js路由包含如下内容:

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', {  path: '' });
});
router.get('/newdirectory', function(req, res) {
  res.render("new-view", { path: '../' });        
});
由于目录结构可能因本地开发环境和实际的生产/测试服务器而异,因此这样做(如果使用类似头部分的概念)将允许您动态地为公共资产提供服务。例如,通过另一个视图的相应路径到另一个视图的渲染路径可能如下所示:

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', {  path: '' });
});
router.get('/newdirectory', function(req, res) {
  res.render("new-view", { path: '../' });        
});

这将允许您修改公共资产(脚本、图像、样式表)等,具体取决于其相对于所请求文件的位置。祝你好运

我建议您使用
console.log(\uu-dirname)
console.log(path.join(\uu-dirname,'public'))
,看看这两者是否都是您所期望的。如果
\uuu dirname
是您所期望的,并且文件位于您所说的位置,并且您使用的URL类似于
href='/stylesheets/style.css'
,那么它应该可以工作(就像它在本地工作一样),因此这些事情之一一定不是您所期望的。您还可以检查文件权限以确保服务器可以读取这些文件。仅供参考,
href='/stylesheets/style.css'
不会“搜索域的根目录”。它只搜索您定义的路由,并
app.use(express.static(path.join(\uu dirname,'public'))
告诉它通过搜索
public/stylesheets/style.css
来搜索
public
子目录中的路径,这正是您想要的。您需要URL上的前导
/
。这里要解决的唯一问题是确保您的服务器在正确的位置查找文件,并且具有读取文件的正确权限。@jfriend00我刚刚测试了
href='./stylesheets/style.css'
,并且我的index.ejs(在根目录下
'/'
)文件在部署服务器上使用css样式进行了完美的渲染。但是,没有使用css样式呈现其他视图,即使它们与index.ejs文件位于同一目录中。。