AF的博客

Windows IoT Core 上部署 Express 项目的一些问题

在 Windows IoT Core 上部署 Express 项目遇到的一些问题

偶然的机会知道了微软发布了 Windows 10 的物联网版本 Windows 10 IoT Core, 距今已经有两年了, 它的官方网站 (https://developer.microsoft.com/en-us/windows/iot)文档和示例清晰完整, 想起买的树莓派3因为懒于学习 Linux 系开发的知识一直在吃灰, 而一脉相承的 .NET 开发体系可以减少学习成本, 就把系统从 Debian 刷成了 Windows 10 IoT Core 。

从安装系统到开发部署第一个示例应用, 按照官方的 Get Started 部分一步步来就可以了, 此时的系统的版本是 14xxx, 如果想部署一个网站, 在一般的主机上只需要装一个 Web 服务器软件就可以了, 而 Windows 10 IoT 只支持 UWP 应用 (或由 Win32 转化的 UWP 应用), 开发语言可以是 C#, C++ 和 Python, 却没有对应的 UWP 服务器软件, 自然地想到不用专门的服务器软件的 Node.js, 而恰好官方示例中有这么一个 Express 的示例, 在 Visual Studio 用到一个叫 NTVS 的 Node.js 开发工具扩展来方便的调试和部署。

而故事(或者事故)就发生在把系统更新到版本15603之后, 这个版本加入了对 Cortana 的支持, 方便开发所谓的智能助理。

用 VS2015 和 NTVS 部署失败

通过 NTVS 提供的 Basic Node.js Express 4 Application (Universal Windows) 模板新建一个 Express Web 项目, 把属性的调试机地址改成 Raspberry Pi 的地址, 启动调试, 在输出窗口中会报出错误:

Unhandled exception at line 234, column 9 in Unknown script code (1)

0x800a1624 - JavaScript runtime error: Reflect.apply: argument is not an array or array-like object

显示发生错误的文件是个动态生成的文件, 显然问题出在运行环境上, 现在看来应该看看 NTVS 的源代码

求助文档, 文档中有个类似 Hello World 的 Express 示例, 其中分明写着准备条件有 VS 2017, 于是就下载安装, 之后再装 NTVS, 找遍上下, 除了一个用于 2017 预览版没有对应的版本, 自然 VS 2017 中也不会出现这类模板可使用, 期间还试过在开发机上安装各种版本的 Node.js for Chakra 来尝试排除部署错误 。

由此陷入了困境, 在某刻灵光一闪, 为什么一定要通过工具部署呢?

直接部署

Node.js 项目既然可以在 PC 上方便的部署, 也可以在安装 Windows 10 IoT Core 的 ARM 的设备上试一试, 于是就下载 GitHub 上 Node.js ChakraCore 的项目给的 Node.js (Chakra) 发布包直接在设备上运行 Node.js 项目, 开始还错了版本, 执行 “node.exe 入口js文件” 时, 发现报出跟上在面一样的错误, 这样可以推断 NTVS 发生这个错误的原因可能是用了旧版的 node.js 执行部署。

用最新版本的 Node.js 启动 Express 网站不会报错, 还以为大功造成了, 没想到存在以下问题

首先是站点启动后, 从外部无法访问, 排除了端口号的问题, 基本上可以确定是请求响应被拦截了, 在 Windows Device Portal 中查看进程, 发现有些进程的权限是 NT_AUTHORITY/SYSTEM, 而 node 进程是 Administrator, 官方文档中描述 Windows IoT Core 系统不同于 PC 操作系统的开放性, 基于物理网设备的专一性, 在安全方面上采用的是一种防御策略, 即对它不能识别的代码有限制。

于是尝试关闭设备的防火墙, 一试还真的可以访问了, 但是还是会报错, 可能是因为直接复制到设备上的网站文件缺少一些并不是网站文件夹下的文件, 由此看看 NTVS 的源代码也是必要的, 可以知道把 Node.js Express 项目部署到 Windows 10 IoT Core 系统中都做了哪些事, 如果有时间可以看一看, 留待以后再说。

至此放弃, 但收获是通过这些调查研究对问题的原因形成了大概的轮廓。于是就考虑如果要部署这类项目, 还是用更为通用成熟的 Linux 系统, 这个问题的解决还是等 NTVS 更新吧。

总结

Windows 10 IoT Core 的目标用户还是设备制造商, 应用开发的平台主要还是 UWP, 所以 NTVS 的更新也不及时, 对于解决这种问题, 就需要拿出专业的精神,足够的时间, 读 NTVS 源码, 读 node.js for chakra 源码, 了解 Windows 10 IoT Core 的方方面面, 一句话, 这可能不是非专业初学者能玩的, 但在查找问题时却可以提升开发者分析解决问题的能力, 还能学到更多的东西。


权版信息
本文永久链接:https://1983cc.github.io/2017/04/27/Windows-IoT-Core-上部署-Express-项目的一些问题/